問題
動的なUI要素を作成する場合(shiny.tag
、shiny.tag.list
、...)、私はしばしばそれが困難な私のコードのロジックから分離し、通常、入れ子になったの複雑な混乱で終わるを見つけるtags$div(...)
ループや条件文と混合し、。見るのが面倒で見苦しい一方で、たとえばhtml-templatesに変更を加える場合など、エラーが発生しやすくなります。
再現可能な例
次のデータ構造があるとします。
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 では機能しません。whiskerの
ようないくつかのrパッケージも調べましたが、それらには同じ制限があり、タグやリスト構造をサポートしていないようです。
ありがとうございました!
htmlTemplate()
条件分岐やループALAハンドルバー、口ひげ、小枝...を可能にする
www
フォルダの下にCSSファイルを保存してからスタイルシートを適用できますか?