R Shiny:选项卡中动态的表数

时间:2016-10-28 13:19:32

标签: r dynamic shiny

首先我知道有很多线程可以解决我的问题,我全都读过,但我没有设法做到。我得到了一个10个data.frame的列表,我通过以下代码构建了它:

list_of_df=list()
for (i in seq(1,10)){
number_row=sample(seq(5,10),size = 1)
num=seq(1,number_row)
val=sample(x = letters,size = number_row,replace = TRUE )
df=data.frame(num=num,
              val=val)
rownames(df)=NULL
list_of_df[[i]]=df
}

我希望用户输入n,即他想要查看的表格数量。然后从list_of_df中显示n个随机表。我想在选项卡中显示这些表。这就是我所做的,我在这里和那里抓住了一些想法,但显然它不起作用,我不知道为什么。

library(shiny)

# ui function
ui = pageWithSidebar(
  headerPanel('Dynamic Tabs'),
  sidebarPanel(
    numericInput(inputId = "numput",label = "number of tables",value = 1,min = 1,max = 5)
  ),
  mainPanel(
    uiOutput('mytabs')  
  )
)


# server function
server = function(input, output, session){

  random_tables<- reactive({
    index=sample(seq(1,10),size = input$numput,replace=FALSE)
    list_of_df[[index]]
  })

  size<-reactive({
    length(random_tables())
  })

  for (i in 1:size()) {
    local({
      my_i <- i
      tablename <- paste("table_", my_i, sep="")

      output[[tablename]] <- renderTable({
        random_tables()[[i]]
      })
    })
  }


  output$mytabs = renderUI({
    nTabs = size()
    myTabs = lapply(paste0('table_', 1: nTabs), function(x){
      tabPanel(x, tableOutput(x))
    })
    do.call(tabsetPanel, myTabs)
  })
}


shinyApp(ui, server)

所以,如果你看到我应该做什么......

1 个答案:

答案 0 :(得分:1)

这是一个工作版本:

library(shiny)

# ui function
ui = pageWithSidebar(
  headerPanel('Dynamic Tabs'),
  sidebarPanel(
    numericInput(inputId = 'numput',label = "number of tables",value = 1,min = 1,max = 5)
  ),
  mainPanel(
    uiOutput('mytabs')  
  )
)

# server function
server = function(input, output, session){
  list_of_df=list()
  for (i in seq(1,10)){
    number_row=sample(seq(5,10),size = 1)
    num=seq(1,number_row)
    val=sample(x = letters,size = number_row,replace = TRUE )
    df=data.frame(num=num,
                  val=val)
    rownames(df)=NULL
    list_of_df[[i]]=df
  }
  random_tables<- reactive({
    index=sample(seq(1,10),size = input$numput,replace=FALSE)
    list_of_df[index]
  })

  size<-reactive({
    input$numput
  })

  observe({
    lapply(seq_len(size()), function(i) {
      local({
        my_i <- i
        tablename <- paste("table_", my_i, sep="")
        output[[tablename]] <- renderTable({
          random_tables()[[i]]
        })
      })
    })
  })

  output$mytabs = renderUI({
    nTabs = size()
    myTabs = lapply(paste0('table_', seq_len(nTabs)), function(x){
      tabPanel(x, tableOutput(x))
    })
    do.call(tabsetPanel, myTabs)
  })

}

shinyApp(ui=ui,server=server)

有几个问题,你用双括号对列表进行子集化,但它不像你想象的那样工作,你需要单个括号。接下来,当您选择单个表时,random_table()是一个data.frame,因此当您调用length时,您会获得2列数。所以只需使用input$numput size(),因为它们是相同的。另外,我将动态输出放在observe中,以便它可以访问被动size()。一件小事,但我使用seq_len代替1:aNumber,因为它更健壮。

希望这有帮助