ปัญหา
เมื่อสร้างองค์ประกอบ 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-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 ฉันยังดูที่ r-packages เช่นwhisker
แต่ดูเหมือนว่าจะมีข้อ จำกัด เหมือนกันและไม่สนับสนุนแท็กหรือโครงสร้างรายการ
ขอบคุณ!
htmlTemplate()
จะอนุญาตให้มีเงื่อนไขและลูป Ala แฮนด์บาร์, หนวด, กิ่งไม้ ...
www
โฟลเดอร์แล้วใช้สไตล์ชีทได้หรือไม่