r - Rshiny:使用循环生成动态 HTML
问题描述
我有兴趣在 Rshiny 中生成一个具有动态值的 div 列表,如下所示。
<div>1</div>
<div>2</div>
<div>3</div>
.
.
.
<div>9</div>
我通过(在服务器上)循环遍历列表中每个元素的列表和向量来做到这一点。我渲染一个 UI output$x1, output$x2, output$x3, etc
。同样,我在 ui 函数上循环创建 9 个 UI 元素。代码如下:
# Define UI for app that draws a histogram ----
ui <- fluidPage(
fluidRow(
lapply(1:9, function(i) {
uiOutput(paste0('x', i))
})
)
)
# Define server logic required to draw a histogram ----
server <- function(input, output) {
obj<- list(
col1=1:3,
col2=4:5,
col3=5:9
)
for(elem in obj){
for(num in elem){
print(paste0(num))
output[[paste0(x,num)]]<-renderUI({
tags$div(
tags$p(
num
)
)
})
}
}
}
shinyApp(ui, server) 我的代码有两个问题:
1)由于某种我不知道的原因,我的 UI 上没有任何内容。
2)我相信当ui打印出来时,它只会打印div的最终值。例如,output$x1 = 9, output$x2= 9, etc
解决方案
在 UI 中使用
tagList
,带有do.call
paste("x"
, 不是paste(x
用于
local
在循环中定义输出,否则你只会得到最后一个
ui <- fluidPage(
fluidRow(
do.call(tagList, lapply(1:9, function(i) {
uiOutput(paste0('x', i))
}))
)
)
server <- function(input, output) {
obj <- list(
col1=1:3,
col2=4:5,
col3=5:9
)
for(elem in obj){
for(num in elem){
local({
mynum <- num
output[[paste0("x",mynum)]] <- renderUI({
tags$div(
tags$p(
mynum
)
)
})
})
}
}
}
shinyApp(ui, server)
推荐阅读
- typescript - Typescipt:如何从 typeorm getManager.query() 访问类内容
- scrapy - 下载页面不返回状态码
- wordpress - 如何更改 Elementor 弹出位置设置?
- php - 在 Laravel 中的点后添加零
- javascript - 使用 JavaScript 中函数的“new”运算符返回值
- wordpress - 如何为 Woocommerce 自定义购物车和结帐页面?
- html - 展开 HTML div 以适应内容
- plantuml - 是否可以在 PlantUML 中对参与者进行分组?
- .net-core - 为什么我们需要更多代码来在 .net 核心中从 www 重定向到非 www?
- javascript - 创建和使用 ejs 辅助函数