【问题标题】:Rshiny: Generating Dynamic HTML using loopsR Shiny:使用循环生成动态 HTML
【发布时间】:2019-05-30 13:05:57
【问题描述】:

我有兴趣在 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(用户界面,服务器) 我的代码有两个问题:

1) 出于某种我不知道的原因,我的 UI 上没有任何内容。

2)我相信当ui打印出来的时候,它只会打印出div的最终值。例如,output$x1 = 9, output$x2= 9, etc

【问题讨论】:

  • @GyD 不确定这有助于解决我的问题,但肯定是一个选项。

标签: r shiny shinyapps


【解决方案1】:
  • 在 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) 

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 2021-01-11
    • 2019-01-15
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多