問題
動的な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.tags では機能しません。whiskerの
ようないくつかのrパッケージも調べましたが、それらには同じ制限があり、タグやリスト構造をサポートしていないようです。
ありがとうございました!
htmlTemplate()条件分岐やループALAハンドルバー、口ひげ、小枝...を可能にする
                
wwwフォルダの下にCSSファイルを保存してからスタイルシートを適用できますか?