在闪亮的主面板中输出多个数据表

时间:2017-04-19 18:41:55

标签: r for-loop shiny lapply dt

我有一个闪亮的应用程序,用户可以检查他们是否想要在主面板中显示数据表。根据数字输入,如果他们选择1,只显示1个数据表,或者如果他们选择2,它将显示2个数据表我不太确定如何在闪亮的R中编码,因为我是新手。感谢您对此进行调查。 这是我的代码

library("shiny")
df1 <- data.frame("2010-01"=double(),
          "2010-02"=double(),
          "2010-03"=double(),
          "2010-04"=double()
          )

df1<-rbind(df1,setNames(as.list(c(10,20,30,40)), names(df2)))

df2 <- data.frame("2010-01"=double(),
          "2010-02"=double(),
          "2010-03"=double(),
          "2010-04"=double()
          )

df2<-rbind(df2,setNames(as.list(c(100,200,300,400)), names(df2)))

df3 <- data.frame("2010-01"=double(),
          "2010-02"=double(),
          "2010-03"=double(),
          "2010-04"=double()
          )

df3<-rbind(df3,setNames(as.list(c(1000,2000,3000,4000)), names(df2)))

ui <-fluidPage(
 sidebarPanel(
   checkboxInput("add_data", "Add Data Table(s)"),
   conditionalPanel(condition="input.add_data === true",
             numericInput("numofdata",
                          label="Number of Data Table(s):",
                          min = 1,
                          max = 3,
                          value = 1,
                          step = 1),
             uiOutput("num_of_data"),
             textOutput("see_ranges")
            ),

    actionButton("submit", "Submit")
 ),

 mainPanel(

 titlePanel("Output Data Table"),

 DT::dataTableOutput("datatable.view", width = "95%")

 ) # end of main panel
)

server <- function(input, output, session) {

  output$num_of_data <- renderUI({
    lapply(1:input$numofdata, function(i) {
    print(trend_list())
  })
 })


 output$see_ranges <- renderPrint({
  print(trend_list())
 })

  data.filter <- reactive({

    df(i) 
  })

output$datatable.view <- DT::renderDataTable(
{
input$submit 
if (input$submit==0) return()

isolate({
for(i in 1:input$numoftrends) {
  datatable(data.filter(i), 
            rownames=FALSE,
            extensions = c("FixedColumns", "FixedHeader", "Scroller"), 
            options = list(searching=FALSE,
                           autoWidth=TRUE,
                           rownames=FALSE,
                           scroller=TRUE,
                           scrollX=TRUE,
                           pagelength=1,
                           fixedHeader=TRUE,
                           class='cell-border stripe',
                           fixedColumns = 
                          list(leftColumns=2,heightMatch='none')
                          )
          )
      }
  })
})
}

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:2)

你应该看看这篇文章: http://shiny.rstudio.com/gallery/creating-a-ui-from-a-loop.html

您将看到,必须在一个renderDataTable内创建多个renderDataTable()而不是多个数据表。 同样在您的代码中,您像函数df一样调用df(),但它只被定义为变量。

请参阅下面的通用运行示例。 编辑:更改了UI的动态部分。

library(DT)
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("amountTable", "Amount Tables", 1:10, 3)
    ),
    mainPanel(
      # UI output
      uiOutput("dt")
    )
  )
)

server <-  function(input, output, session) {
  observe({
    lapply(1:input$amountTable, function(amtTable) {
      output[[paste0('T', amtTable)]] <- DT::renderDataTable({
        iris[1:amtTable, ]
      })
    })
  })

  output$dt <- renderUI({
    tagList(lapply(1:input$amountTable, function(i) {
      dataTableOutput(paste0('T', i))
    }))
  })

}

shinyApp(ui, server)