R Shiny-文件下载遇到麻烦

时间:2019-01-28 19:16:05

标签: r shiny

所以我想拥有一个闪亮的页面,其中: A)允许用户上传.xls文件; B)把该文件作为.csv文件提供给用户下载; C)在Shiny应用程序中打印文件的开头,以确保已正确读取。

这是我正在使用的代码:

# Want to read xls files with readxl package
library(readxl)
library(shiny)

## Only run examples in interactive R sessions
if (interactive()) {

  ui <- fluidPage(
    fileInput("file1", "Choose File", accept = ".xls"),
    tags$hr(),
    uiOutput("downloader"),
    htmlOutput("confirmText", container = tags$h3),
    tableOutput("listContents")
    )

  server <- function(input, output) {

    theOutput <- reactiveValues(temp = NULL, df = NULL, msg = NULL, fn = NULL)

    observeEvent(input$file1, {
      theOutput$fn <- paste('data-', Sys.Date(), '.csv', sep='')
      theOutput$temp <- read_xls(input$file1$datapath)
      theOutput$msg <- paste("File Contents:")
      theOutput$df <- write.csv(theOutput$temp, 
                                file = theOutput$fn, 
                                row.names = FALSE)
    })

    output$confirmText <- renderText({
      theOutput$msg
    })

    output$listContents <- renderTable({
      head(theOutput$temp)
    })

    output$downloader <- renderUI({
      if(!is.null(input$file1)) {
        downloadButton("theDownload", label = "Download")
        }
      })

    output$theDownload <- downloadHandler(
      filename = theOutput$fn,
      content = theOutput$df
      )
  }

  shinyApp(ui, server)
}

“闪亮”页面可以正确呈现,可以毫无问题地接受上传,可以毫无问题地打印出.csv的标题,并且可以在同一页面中创建格式正确的“ data- {today's date} .csv”文件目录作为app.R文件。

问题是,当我按下下载按钮时,我收到错误消息:

Warning: Error in download$func: attempt to apply non-function                                                    
  [No stack trace available]

有人可以告诉我我在做什么错吗?

1 个答案:

答案 0 :(得分:0)

由于上面的注释,这是我找到的解决方案(添加了注释,以显示代码更改的地方):

library(readxl) 
library(shiny) 
if (interactive()) {
    ui <- fluidPage(
    fileInput("file1", "Choose File", accept = ".xls"),
    tags$hr(),
    uiOutput("downloader"),
    htmlOutput("confirmText", container = tags$h3),
    tableOutput("listContents")
    )
     server <- function(input, output) {

    theOutput <- reactiveValues(temp = NULL, msg = NULL)

    observeEvent(input$file1, {
      # Do not try to automate filename and the write.csv output here!
      theOutput$temp <- read_xls(input$file1$datapath)
      theOutput$msg <- paste("File Contents:")
    })

    output$confirmText <- renderText({
      theOutput$msg
    })

    output$listContents <- renderTable({
      head(theOutput$temp)
    })

    output$downloader <- renderUI({
      if(!is.null(input$file1)) {
        downloadButton("theDownload", label = "Download")
        }
      })

    output$theDownload <- downloadHandler(
      # Filename and content need to be defined as functions 
      # (even if, as with filename here, there are no inputs to those functions)
      filename = function() {paste('data-', Sys.Date(), '.csv', sep='')},
      content = function(theFile) {write.csv(theOutput$temp, theFile, row.names = FALSE)}
      )   }
     shinyApp(ui, server) }

内容接受一个参数(在这里命名为“ theFile”),而在其他任何地方都没有调用它,这就是让我失望的原因。