首页 > 解决方案 > 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

标签: rshinyshinyapps

解决方案


  • 在 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) 

推荐阅读