简体   繁体   English

R Shiny-文件下载遇到麻烦

[英]R shiny - having trouble with file download

So I want to have a Shiny page which: A) Allows the user to upload a .xls file; 因此,我想拥有一个闪亮的页面,其中:A)允许用户上传.xls文件; B) Offers that file back to the user for download as a .csv file; B)把该文件作为.csv文件提供给用户下载; C) Prints the head of the file in the Shiny app to ensure that it was properly read. C)在Shiny应用程序中打印文件的开头,以确保已正确读取它。

Here is the code I am using: 这是我正在使用的代码:

# 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)
}

The Shiny page renders correctly, it accepts the upload with no problems, it prints out the head of the .csv with no problems, and it creates a properly formatted "data-{today's date}.csv" file in the same directory as the app.R file. “闪亮”页面可以正确呈现,可以毫无问题地接受上传,可以毫无问题地打印出.csv的标题,并且可以在与该目录相同的目录中创建格式正确的“ data- {today's date} .csv”文件app.R文件。

Problem is, when I hit the download button I get the error message: 问题是,当我按下下载按钮时,出现错误消息:

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

Can someone tell me what I am doing wrong? 有人可以告诉我我在做什么错吗?

Thanks to the comments above, this is the solution I found (with my comments added, to show where the code changed): 感谢上面的评论,这是我找到的解决方案(添加了我的评论,以显示代码更改的地方):

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) }

The fact that content takes an argument (named here "theFile"), which is not called anywhere else, is what was throwing me off. 内容带有一个自变量(在此命名为“ theFile”),而在其他任何地方都没有被调用,这一事实使我不知所措。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM