【问题标题】:R/Shiny Download Handler Results in trunctated .csv fileR/Shiny 下载处理程序导致截断的 .csv 文件
【发布时间】:2018-01-14 14:33:50
【问题描述】:

我已经构建了一个将数据帧存储在反应值中的应用程序。然后我有一个 UI 下载按钮,可以将该数据框下载到 CSV 文件中。它运行良好,直到 CSV 文件变得非常大。我估计大约 100MB,但很难确定。

我的代码不起眼 - 但一个最小的可重现示例可能如下。似乎在本地运行它和在我的 Shiny Server 实例 (Amazon EC2) 上运行它可能有所不同。

ui.R

shinyUI(downloadButton("goDownload","Download Large File"))

服务器.R

library(shiny)

shinyServer(function(input, output, session) {

 op <- reactiveValues(data = NULL)

op$dataOp<-data.frame(col1=seq(0:30000000),col2=seq(30000000:0)

dataOp <- reactive({
  if (!is.null(op$dataOp)){
    op$Labels
  } else {
    print("no op$dataOp")
  }
  })


output$goDownload<- downloadHandler(
    filename = function() { paste('Data.csv', sep='') },
    content = function(filename) {
      write.csv(dataOp(), filename, row.names = F)
    })

})

【问题讨论】:

  • 我的猜测是这个问题只发生在 rstudio 内置浏览器中,而不发生在 外部浏览器中?
  • 我在 Chrome 中运行。希望就这么简单!当前的假设(因为我在内存中存储多个数据帧)是,总的来说,我正在最大限度地利用可用内存的数量,这会导致问题。我想我需要将数据帧作为 csvs 写入磁盘,然后直接调用 csvs。
  • 不确定,但这会不会:options(shiny.maxRequestSize=30*1024^2) 帮助?
  • 感谢@parth,不幸的是,我已经在使用 options(shiny.maxRequestSize = 800 * 1024 ^ 2)。
  • 有解决办法吗,我的应用也有同样的问题。

标签: r shiny


【解决方案1】:

我最好的猜测是你没有等待足够长的时间让闪亮完成将文件写入磁盘。写入大文件需要 R 大量时间(您提供的数据帧需要 30-60 秒的时间来写入)。

要注意的另一件事是,闪亮不会直接写入您在filename 中提供的文件。相反,它将数据写入临时文件,然后将该临时文件复制到filename....这两个步骤都需要时间,因此您必须在 R 执行其操作时让会话保持打开状态。下面的例子对我有用。

library(shiny)

ui <- fluidPage(
  downloadButton("big_download", "Download Large File"),
  downloadButton("small_download", "Download small File")
)

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

  big_data <- data.frame(col1 = seq(0:30000000), col2 = seq(30000000:0))
  small_data <- mtcars

  output$big_download <- downloadHandler(
    filename = function() {
      "big-data.csv"
    },
    content = function(filename) {
      print("writing data to tempfile")
      write.csv(big_data, filename, row.names = F)
      print("finished writing to tempfile, now copying it")
    }
  )

  output$small_download <- downloadHandler(
    filename = function() {
      "small-data.csv"
    },
    content = function(filename) {
      write.csv(small_data, filename, row.names = F)
    }
  )

})

shinyApp(ui, server)

【讨论】:

  • 非常感谢!!仍然..错误发生,我在服务器上运行我的应用程序,一段时间后没有任何反应,我收到网络连接错误,这使应用程序完全崩溃。对于小数据,我完全没有问题。我将尽快尝试提出一个新问题,并提供有关我的代码的更多详细信息(因为这个问题是从另一个用户那里提出的)
  • 嗯,很有趣。您能否提供有关您的环境的更多详细信息(例如,闪亮的服务器版本、操作系统、闪亮的版本等)?
  • 当然,只要我回到办公桌前!再次感谢。
  • 我“解决了”这个问题,方法是将数据保存在我的服务器上并使用操作按钮链接到该路径方向。所以仍然没有解决这个问题,但我的特殊情况的解决方法。
猜你喜欢
  • 2017-10-10
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2021-11-20
  • 2018-07-29
  • 1970-01-01
  • 2016-02-26
相关资源
最近更新 更多