문제
ui-elements ( 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-tags로 푸시하려면 일반적으로 다음과 같은 결과가 나타납니다.
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()
조건문을 허용하고 알라 핸들 루프 것, 수염은 ... 나뭇 가지
www
폴더 아래에 저장 한 다음 스타일 시트를 적용 할 수 있습니까?