【问题标题】:Download table generated independetly in renderTable output in R shiny下载在R闪亮的renderTable输出中独立生成的表
【发布时间】:2018-11-08 10:41:33
【问题描述】:

我正在尝试使用 R shiny 中的 renderTable 函数生成一个表,然后使用 downloadHandler 函数将该表/data.frame 下载为 csv 文件。不知何故,我不断收到以下错误:

下载过程中发生错误: 下载错误http://127:0:0.1:3001/session/ 0303bd426fce88837ae277aa3b406dd/download/downloadData?w= - 服务器 回复:内部服务器错误

下面是一个示例代码,我生成了一个简单的数据框并尝试使用 downloadHander 下载它:

library(shiny)
 # Define UI for data download app ----
ui <- fluidPage(

    # App title ----
    titlePanel("Downloading Data"),

    # Sidebar layout with input and output definitions ----
    sidebarLayout(

        # Sidebar panel for inputs ----
        sidebarPanel(
            # Button
            downloadButton("downloadData", "Download")

        ),

        # Main panel for displaying outputs ----
        mainPanel(

            tableOutput("table")

        )

    )
)
# Define server logic to display and download selected file ----
server <- function(input, output) {

    # Table of selected dataset ----
    output$table <- renderTable({
        data.frame(a =c(1,2,3),b=c("q","s","f"))
    })

    # Downloadable csv of selected dataset ----
    output$downloadData <- downloadHandler(
        filename = function() {
            paste("test.csv")
        },
        content = function(file) {
            write.csv(output$table, file, row.names = FALSE)
        }
    )

}
shinyApp(ui,server)

【问题讨论】:

  • renderTable() 为 UI 准备输出。我想你想要的是创建一个reactive() 可以被renderTabledownloadHandler 调用的数据框。

标签: r shiny


【解决方案1】:

您无法导出 renderTable{},因为这会将许多元素放入 HTML, 您需要预先保存进入表格的数据并将其导出 分开。

dataTable<-data.frame(a =c(1,2,3),b=c("q","s","f"))

output$downloadData <- downloadHandler(

  filename = function() {
    ('test.csv')
  }, 

  content = function(con) {
    write.table(dataTable,row.names = FALSE,col.names=T, sep=",",con)
  },
  contentType="csv"
)

【讨论】:

  • 很好的答案,但如果您希望它可以在实际闪亮的应用程序中使用,您确实应该将 dataTable 设为 reactive
  • 我认为这取决于他/她的应用程序的性质,因为您可以观察一个按钮来创建数据框,创建一个反应函数,或者如您所说创建一个对用户输入反应的数据集.无论哪种方式,我都没有该信息,设置数据表只是一个示例。 @divibisan
【解决方案2】:

这里有几件事需要做:

  1. 如果您的应用要动态呈现数据,则应将您的数据分配给某个 reactive 表达式。
  2. 现在数据的下载变得很容易,只需调用 (1) 中编写的 reactive 表达式即可。
    • 上面的点 (1) 和 (2) 将确保用户下载的数据与屏幕上看到的数据相同。

尝试以下方法:

library(shiny)

ui <- fluidPage(
  titlePanel("Downloading Data"),
  sidebarLayout(
    sidebarPanel(downloadButton("downloadData", "Download")),
    mainPanel(tableOutput("table"))
  )
)

server <- function(input, output) {

  data <- shiny::reactive(data.frame(a = c(1, 2, 3), b = c("q", "s", "f")))
  output$table <- renderTable(data())

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

}
shinyApp(ui,server)

【讨论】:

    猜你喜欢
    • 2014-02-28
    • 2014-06-30
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2021-03-15
    相关资源
    最近更新 更多