Sorun
Dinamik olarak ui-elements ( shiny.tag
,, shiny.tag.list
...) oluştururken, genellikle kod mantığımdan ayırmakta zorlanır ve genellikle iç içe geçmiş tags$div(...)
, döngüler ve koşullu ifadelerle karıştırılmış kıvrımlı bir karmaşa ile sonuçlanır . Sinir bozucu ve çirkin görünmekle birlikte, örneğin html şablonlarında değişiklik yaparken de hataya açıktır.
Tekrarlanabilir örnek
Diyelim ki aşağıdaki veri yapısına sahibim:
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")
)
)
)
Şimdi bu yapıyı ui-etiketlerine itmek istiyorsam, genellikle şöyle bir şeyle sonuçlanırım:
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)
Gördüğünüz gibi, bu zaten oldukça dağınık ve gerçek benzeri örneklerime kıyasla hala hiçbir şey yok.
İstenen çözüm
Şablonları ve verileri ayrı ayrı tanımlayabilecek R için cazip bir motora yakın bir şey bulmayı umuyordum :
# 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}}"
)
)
Önceki denemeler
İlk olarak, bunun shiny::htmlTemplate()
bir çözüm sunabileceğini düşündüm , ancak bu sadece dosyalar ve metin dizeleriyle çalışır, shiny.tag
s değil . Ayrıca bıyık gibi bazı r-paketlerine de baktım
, ancak bunlar aynı sınırlamaya sahip görünüyor ve etiketleri veya liste yapılarını desteklemiyor.
Teşekkür ederim!
htmlTemplate()
koşullu ve döngüler ala gidon, bıyık, dal izin verir
www
klasör altına kaydedip stil sayfalarını uygulayabilir misiniz?