Problem
Wenn dynamisch ui-Elemente zu schaffen ( shiny.tag
, shiny.tag.list
, ...), finde ich es oft schwierig , es von meiner Code - Logik zu trennen und in der Regel mit einem gewundenen Durcheinander von verschachteltem Endetags$div(...)
, gemischt mit Schleifen und bedingten Anweisungen. Es ist zwar nervig und hässlich anzusehen, aber auch fehleranfällig, z. B. wenn Änderungen an HTML-Vorlagen vorgenommen werden.
Reproduzierbares Beispiel
Angenommen, ich habe die folgende Datenstruktur:
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")
)
)
)
Wenn ich diese Struktur jetzt in UI-Tags verschieben möchte, habe ich normalerweise Folgendes:
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)
Wie Sie sehen können, ist dies bereits ziemlich chaotisch und immer noch nichts im Vergleich zu meinen echten Beispielen.
Gewünschte Lösung
Ich hatte gehofft, etwas in der Nähe einer Vorlagen- Engine für R zu finden, mit dem Vorlagen und Daten separat definiert werden können :
# 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}}"
)
)
Frühere Versuche
Zuerst dachte ich, das shiny::htmlTemplate()
könnte eine Lösung bieten, aber dies würde nur mit Dateien und Textzeichenfolgen funktionieren, nicht mit shiny.tag
s. Ich habe mir auch einige R-Pakete wie Whisker angesehen
, aber diese scheinen die gleiche Einschränkung zu haben und unterstützen keine Tags oder Listenstrukturen.
Vielen Dank!
htmlTemplate()
würden Bedingungen und Schlaufen ua Lenker, Schnurrbart, Zweig ...
www
Ordner speichern und dann die Stylesheets anwenden?