2016-10-28 32 views
1

首先,我知道有很多线索可以解决我的问题,我都读过它们,但是我没有做到。我得到了10 data.frame的名单,我通过下面的代码生成:R Shiny:选项卡中的表格的动态数量

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

这里是一个工作版本:

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()。一件小事,但我用​​而不是1:aNumber,因为它更健壮。

希望这会有帮助

+0

非常感谢您的解释。现在对我来说更加清晰。我有点麻烦来理解观察部分,但我想我会。 –

相关问题