मुसीबत
जब गतिशील रूप से 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")
)
)
)
अगर मैं अब इस संरचना को यूआई-टैग में धकेलना चाहता हूं, तो मैं आमतौर पर कुछ इस तरह से समाप्त करता हूं:
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)
जैसा कि आप देख सकते हैं, यह पहले से ही काफी गड़बड़ है और अभी भी मेरे वास्तविक उदाहरणों की तुलना में कुछ भी नहीं है।
वांछित समाधान
मैं आर के लिए एक अस्थायी इंजन के करीब कुछ खोजने की उम्मीद कर रहा था , जो टेम्पलेट्स और डेटा को अलग से परिभाषित करने की अनुमति देगा :
# 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
एस नहीं । मैंने कुछ आर-पैकेज जैसे व्हिस्कर पर भी नज़र डाली थी
, लेकिन लगता है कि वे समान सीमा वाले हैं और टैग या सूची-संरचनाओं का समर्थन नहीं करते हैं।
धन्यवाद!
htmlTemplate()
सशर्त, के लिए अनुमति देते हैं और आला हैंडल लूप होता है, मूँछ, टहनी ...
www
फ़ोल्डर के तहत एक सीएसएस फ़ाइल को बचा सकते हैं और फिर स्टाइल शीट लगा सकते हैं?