Проблема
При динамічному створенні UI-елементів ( shiny.tag
, shiny.tag.list
, ...), я часто важко відокремити його від моєї логіки коди і зазвичай закінчуються згорнутим місивом вкладеного tags$div(...)
, змішане з петлями і умовними операторами. Хоча це дратує і некрасиво дивитися, але воно також схильне до помилок, наприклад, при внесенні змін у HTML-шаблони.
Відтворюваний приклад
Скажімо, у мене є така структура даних:
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")
)
)
)
Якщо я зараз хочу пересувати цю структуру в ui-теги, я зазвичай закінчуюсь чимось на зразок:
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)
Як бачите, це вже досить безладно і досі нічого в порівнянні з моїми реальними подібними прикладами.
Бажане рішення
Я сподівався знайти щось близьке до двигуна шаблонів для R, що дозволить окремо визначати шаблони та дані :
# 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}}"
)
)
Попередні спроби
По-перше, я думав, що shiny::htmlTemplate()
може запропонувати рішення, але це буде працювати лише з файлами та текстовими рядками, а не shiny.tag
s. Я також переглянув деякі r-пакети, такі як віскі
, але, схоже, вони мають таке ж обмеження і не підтримують теги чи структури списків.
Дякую!
htmlTemplate()
дозволить умовним і петлі али рулів, вуса, прут ...
www
папкою, а потім застосувати таблиці стилів?