如何通过读取R闪亮循环中的.csv文件来动态生成dataTableOutput?

时间:2016-02-09 06:22:20

标签: r shiny

我有一个生成“n”个数据帧并将其作为csv文件保存在某个位置的函数,该函数返回已保存CSV的文件名。

我希望获取这些csv文件,使用read.csv()读取它,然后使用renderUI和renderDataTable()

在UI上显示它

虽然下面的代码没有语法错误,但没有显示在屏幕上。

请建议一种适当的方法,通过该方法,可以在输出中使用在server.R的一部分中生成的表,并在UI上显示这些数据表。

该功能的代码如下:

功能

GenerateData <- function(){
   #********************************************************************
   # some sample data (originally, my data comes from an external souce)
   #--------------------------------------------------------------------
   a <- 1:10
   b<- 21:30
   c<-41:50
   sampleDat1 <- data.frame(a,b,c)
   sampleDat2<- data.frame(c,a,b,a)
   NumOfDataFrames <- 2
   #--------------------------------------------------------------------
   FilePath <- "D:/FolDerName/"
   FullPath<-WriteStatement <- NULL
   for(i in 1:NumOfDataFrames){

      FullPath[i]<-paste0(FilePath,"sampleDat",i,".csv")
      WriteStatement[i]<-paste0("write.csv(sampleDat",i,",file = '",FullPath[i],"')")
      eval(parse(text=WriteStatement[i]))
   }
   return(FullPath)

}

UI.r

library(shiny)
shinyUI(

   fluidPage(

      # Application title

      navbarPage("Sample Data Display",
                 tabPanel("Data",
                          sidebarLayout(
                             sidebarPanel(
                                titlePanel("Sample"),
                                numericInput("sample1",label = "Some Label",value = 20),
                                numericInput("sample2",label = "Some Other Label",value = 20)
                             ),
                             mainPanel(
                                uiOutput("result")

                             )
                          )
                 )
      )
   )
)

服务器。

library(shiny)

GenerateData <- function(){
   #********************************************************************
   # already mentioned above, please copy the contents to server.R
   #--------------------------------------------------------------------


}
shinyServer(function(input, output,session) {
   dataSrc <- reactive({
      paths <- GenerateData()
      return(paths)
   })
   output$result <- renderUI({
      dataTab1<-NULL
      MyFilePath <- dataSrc()
      for (i in 1:length(MyFilePath)){
         dataTab1 <- read.csv(MyFilePath[i])
         # print(dataTab1)
         renderDataTable(dataTab1)
         dataTab1<-NULL

      }

   })
}
)

enter image description here

1 个答案:

答案 0 :(得分:1)

你可以尝试

1)使用df

列表
GenerateData <- function(){
  #********************************************************************
  # some sample data (originally, my data comes from an external souce)
  #--------------------------------------------------------------------
  a <- 1:10
  b<- 21:30
  c<-41:50
  sampleDat1 <- data.frame(a,b,c)
  sampleDat2<- data.frame(c,a,b,a)
  NumOfDataFrames <- 2
  ls_df=list(sampleDat1,sampleDat2)
  names(ls_df)=c("sampleDat1","sampleDat2")
  #--------------------------------------------------------------------
  FilePath <- "C:\\12324\\files\\"
  FullPath=character()
  for(i in 1:length(ls_df)){
    FullPath[i]<-paste0(FilePath,names(ls_df)[i],".csv")
    write.csv(x=ls_df[[i]],file = FullPath[[i]])
  }
  return(FullPath)

}

2)Server.R(创建dinamic ui并分两步渲染DT)

shinyServer(function(input, output,session) {
  dataSrc <- reactive({
    paths <- GenerateData()
    return(paths)
  })
  output$result <- renderUI({
    MyFilePath <- dataSrc()
    lapply(1:length(MyFilePath),function(i)dataTableOutput(paste0('tbl',i)))
  })
  observe({
    MyFilePath <- dataSrc()
    lapply(1:length(MyFilePath),function(i) output[[paste0("tbl",i)]]<-renderDataTable(read.csv(MyFilePath[i])))

  })
}
)