R Shiny动态标签号和输入生成

时间:2017-03-01 14:59:05

标签: r loops shiny

我目前的闪亮代码存在问题。 我必须根据给定函数的结果生成动态数量的选项卡(该部分工作正常)。然后,我想在其他循环中生成这些选项卡的输入,例如renderText。但是,我生成的renderText的textOutput的最终输出始终是循环的最后一个renderText。

以下是这个想法的一个小例子:

 library(shiny)
 library(shinydashboard)


 ui <- pageWithSidebar(
         headerPanel("xxx"),
         sidebarPanel(),
         mainPanel(
           uiOutput("multipleUI")
         )
      )


server <- function(input, output) {
      output$multipleUI <- renderUI({
      tabs <- list(NULL)
      for(i in 1:5){
          tabs[[i]] <- tabPanel(title = paste0("tab ",i),
                      textOutput(paste0("out",i)), # prints j as 5 in all tabs
                      paste0("local out ",i)) # prints i as current loop value for each tab)
     }
     do.call(tabBox,tabs)
  })
  observe({ 
    for(j in 1:5){ 
      txt = paste0("generated out ", j)
      print(txt) # print with current j
      output[[paste0("out",j)]] <- renderText({txt})
    }
  })
}

shinyApp(ui, server)

虽然对于我可以解决这个问题的renderText来说可能没那么重要,但我打算渲染很多情节和表格,并且无法想到那里的解决方法。

我很感激任何帮助!

编辑:我已更新代码以显示一个小工作示例

1 个答案:

答案 0 :(得分:0)

这是一个似乎有效的解决方案。我正在使用lapply来创建标签。如果它能满足您的需求,请告诉我。

library(shiny)

ui <- pageWithSidebar(
  headerPanel("xxx"),
  sidebarPanel(),
  mainPanel(
    do.call(tabsetPanel, c(id='tab',lapply(1:5, function(i) {
      tabPanel(
        title=paste0('tab ', i), 
        textOutput(paste0('out',i))
      )
    })))
  )
)

server <- function(input, output) {     
  lapply(1:5, function(j) {
    output[[paste0('out',j)]] <- renderPrint({
      paste0('generated out ', j)
    })
  })
}

shinyApp(ui, server)