我目前的闪亮代码存在问题。 我必须根据给定函数的结果生成动态数量的选项卡(该部分工作正常)。然后,我想在其他循环中生成这些选项卡的输入,例如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来说可能没那么重要,但我打算渲染很多情节和表格,并且无法想到那里的解决方法。
我很感激任何帮助!
编辑:我已更新代码以显示一个小工作示例
答案 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)