R Shiny-反应性数据帧下载到csv

时间:2018-11-02 21:09:19

标签: r shiny event-handling shiny-server shiny-reactivity

我制作了一个应用程序,允许用户上传多个csv文件。

然后这些csvs一起“ rbind”,即“ read.csv”,并在df中添加一列,即文件名。

然后处理df以生成可下载的各种图。这很完美。但是,当我尝试从反应性元素中下载特定的数据帧时,我无法使其正常工作。

在此示例中,我想从testinput反应函数中下载 df1

UI:

    dashboardPage( skin = "black",
   dashboardHeader(title = "myApp"),
   dashboardSidebar(collapsed = TRUE,
   sidebarMenu(
    menuItem("Home", tabName = "dashboard1", icon = icon("home", lib = 
  "glyphicon"))
    ) 
    ),
   dashboardBody(
     tags$head(tags$style(HTML('
      .main-header .logo {
                          font-family: "Times New Roman", serif;
                          font-weight: bold;
                          font-size: 24px;
                          }
                          '))),

tabItems(
  tabItem(tabName = "dashboard1",
          fileInput("file1",
                    label="Input files:",
                    multiple = TRUE),
          downloadButton('downloadData', 'Download Data')
  )
  )

)
)

服务器:

     library(shiny)
     library(shinydashboard)

     #server start
     function(input, output) {

       testinput<- reactive({
if(is.null(input$file1))
  return ()
else 
{
  nfiles = nrow(input$file1) 
  csv = list()
  for (i in 1 : nfiles)
  {

    csv[[i]] = read.csv(input$file1$datapath[i])

  }

  csv_names <- input$file1[['name']]
    actual_names<-input$statics$name
  df1<-cbind(actual_names, csv_names)
  mydata <- do.call(rbind, lapply(csv_names, function(x) cbind(read.csv(x), name=strsplit(x,'\\.')[[1]][1])))
    df1<-cbind(df1, mydata)    
  }
   })

     output$downloadData <- downloadHandler(
filename = function() { paste(input$downloadData, " ",Sys.Date(),".csv",sep="") },
content = function(file) {
  write.csv(df1,file)
}
    )

 )


   }

任何帮助都将非常有用,因为我已经搜索了很多SO和其他论坛,而且我陷于困境。

2 个答案:

答案 0 :(得分:0)

@Chabo是正确的:

我必须创建一个新的react(),然后将其作为输出$呈现到我的UI。

然后我可以下载响应事件

答案 1 :(得分:0)

我认为您可以在反应式函数中返回要下载的变量,然后在服务器函数中添加如下所示的下载数据:

library(shiny)
library(shinydashboard)

#server start
function(input, output) {

  testinput<- reactive({
    if(is.null(input$file1)){
        return ()
    }
    else{
        nfiles = nrow(input$file1) 
        csv = list()
    }

    for (i in 1 : nfiles){

        csv[[i]] = read.csv(input$file1$datapath[i])

    }

    csv_names <- input$file1[['name']]
    actual_names<-input$statics$name
    df1<-cbind(actual_names, csv_names)
    mydata <- do.call(rbind, lapply(csv_names, function(x) cbind(read.csv(x), name=strsplit(x,'\\.')[[1]][1])))
    df1<-cbind(df1, mydata)  
    return(df1)
  })

  output$downloadData <- downloadHandler(
    filename = function() {
      paste(input$dataset, ".csv", sep = "")
    },
    content = function(file) {
      write.csv(testinput(), file, row.names = FALSE)
    })
}