Problème
Lors de la création dynamique ui-éléments ( shiny.tag
, shiny.tag.list
, ...), je trouve qu'il est souvent difficile de le séparer de ma logique de code et finissent généralement avec un désordre alambiqué de imbriqué tags$div(...)
, mélangé avec des boucles et des instructions conditionnelles. Bien que gênant et laid à regarder, il est également sujet aux erreurs, par exemple lors de la modification de modèles html.
Exemple reproductible
Disons que j'ai la structure de données suivante:
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")
)
)
)
Si je veux maintenant pousser cette structure en ui-tags, je me retrouve généralement avec quelque chose comme:
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)
Comme vous pouvez le voir, c'est déjà assez désordonné et toujours rien par rapport à mes vrais exemples.
Solution souhaitée
J'espérais trouver quelque chose de proche d'un moteur de template pour R, qui permettrait de définir des modèles et des données séparément :
# 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}}"
)
)
Tentatives précédentes
Tout d'abord, je pensais que cela shiny::htmlTemplate()
pourrait offrir une solution, mais cela ne fonctionnerait qu'avec des fichiers et des chaînes de texte, pas l' shiny.tag
art. J'ai également jeté un coup d'œil à certains r-packages comme whisker
, mais ceux-ci semblent avoir la même limitation et ne prennent pas en charge les balises ou les structures de liste.
Je vous remercie!
htmlTemplate()
cela permettrait de conditionner et de boucler ala guidon, moustache, brindille ...
www
dossier, puis appliquer les feuilles de style?