Vấn đề
Khi tự động tạo các phần tử ui ( shiny.tag
,, shiny.tag.list
...), tôi thường gặp khó khăn khi tách nó khỏi logic mã của mình và thường kết thúc bằng một mớ hỗn độn của lồng nhau tags$div(...)
, trộn lẫn với các vòng lặp và các câu lệnh có điều kiện. Mặc dù khó chịu và xấu xí khi nhìn vào, nó cũng dễ bị lỗi, ví dụ như khi thay đổi các mẫu html.
Ví dụ sinh sản
Giả sử tôi có cấu trúc dữ liệu sau:
my_data <- list(
container_a = list(
color = "orange",
height = 100,
content = list(
vec_a = c(type = "p", value = "impeach"),
vec_b = c(type = "h1", value = "orange")
)
),
container_b = list(
color = "yellow",
height = 50,
content = list(
vec_a = c(type = "p", value = "tool")
)
)
)
Nếu bây giờ tôi muốn đẩy cấu trúc này vào thẻ ui, tôi thường kết thúc bằng một cái gì đó như:
library(shiny)
my_ui <- tagList(
tags$div(
style = "height: 400px; background-color: lightblue;",
lapply(my_data, function(x){
tags$div(
style = paste0("height: ", x$height, "px; background-color: ", x$color, ";"),
lapply(x$content, function(y){
if (y[["type"]] == "h1") {
tags$h1(y[["value"]])
} else if (y[["type"]] == "p") {
tags$p(y[["value"]])
}
})
)
})
)
)
server <- function(input, output) {}
shinyApp(my_ui, server)
Như bạn có thể thấy, điều này đã khá lộn xộn và vẫn không có gì so với các ví dụ thực sự của tôi.
Giải pháp mong muốn
Tôi đã hy vọng tìm thấy một cái gì đó gần với một công cụ tạo khuôn mẫu cho R, điều đó sẽ cho phép xác định các mẫu và dữ liệu riêng biệt :
# syntax, borrowed from handlebars.js
my_template <- tagList(
tags$div(
style = "height: 400px; background-color: lightblue;",
"{{#each my_data}}",
tags$div(
style = "height: {{this.height}}px; background-color: {{this.color}};",
"{{#each this.content}}",
"{{#if this.content.type.h1}}",
tags$h1("this.content.type.h1.value"),
"{{else}}",
tags$p(("this.content.type.p.value")),
"{{/if}}",
"{{/each}}"
),
"{{/each}}"
)
)
Những nỗ lực trước đây
Đầu tiên, tôi nghĩ rằng shiny::htmlTemplate()
có thể cung cấp một giải pháp, nhưng điều này sẽ chỉ hoạt động với các tệp và chuỗi văn bản, không phải shiny.tag
s. Tôi cũng đã xem xét một số gói r như whisker
, nhưng những gói đó dường như có cùng giới hạn và không hỗ trợ thẻ hoặc cấu trúc danh sách.
Cảm ơn bạn!
htmlTemplate()
sẽ cho phép các điều kiện và vòng lặp ala tay lái, ria mép, cành cây ...
www
thư mục và sau đó áp dụng biểu định kiểu?