闪亮:下载 table 数据和绘图

Shiny: download table data and plot

我正在学习 shiny 并且我正在创建一个闪亮的应用程序,它应该使用户能够:

1- 将数据上传为 .csv 文件

2- 获取统计数据和图表

3- 下载 table 数据为 .csv 并绘制为 .png

输入文件

我从 diamonds data.frame

创建了要在应用程序中使用的输入 .csv 文件
library(ggplot2)
df <-  diamonds[1:5000, ]
head(df)
write.csv(df, "df.csv")

App.R

library(ggplot2)
library(dplyr)
library(DT)
library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(fileInput("file","Upload your file"), 
      width =2),
  mainPanel(
   width = 10,
   dataTableOutput("table"),
   downloadButton("downloadtable", "Download the table"),
   tags$br(),
   tags$hr(),
   plotOutput("plot1"),
   downloadButton("downloadplot1", "Download the plot"), 
   tags$br(),
   tags$hr(),
   plotOutput("plot2"),
   downloadButton("downloadplot2", "Download the plot")
   )
)
)

server <- function(input,output){

  data <- reactive({

    file1 <- input$file
    if(is.null(file1)){return()} 

    read.csv(file1$datapath, header=TRUE, sep=',')

  })


  output$table <- renderDataTable({
    if (is.null(data())) { return() }

    df1 <- data()

    df2 <- df1 %>% 
      dplyr::select(cut, color, price) %>% 
      dplyr::group_by(cut, color) %>% 
      dplyr::summarise_each(funs(
        min(.),
        mean(.), 
        median(.),
        max(.),
        sd(.), 
        n() 
      ))  
  })  

  output$downloadtable <- downloadHandler(
    filename = function() {
      paste('stats', '.csv', sep='')
    },
    content = function(file) {
      write.csv(df2, file)
    }
  )

  output$plot1 <- renderPlot({
    if (is.null(data())) { return() }
    df1 <- data()

    ggplot(df1, aes (x =carat, y = price, col = color))+
      geom_point()+
      facet_wrap(~cut)

  }
  )

  output$downloadplot1 <- downloadHandler(
    filename = function() {
      paste('plot1', 'png', sep = ".")
    },
    content = function(file) {
     png(file)

      df1 <- data()

      ggplot(df1, aes (x =carat, y = price, col = color))+
        geom_point()+
        facet_wrap(~cut) 

      dev.off()

    }
  )

  output$plot2 <- renderPlot({
    if (is.null(data())) { return() }
    df1 <- data()

    ggplot(df1, aes (x = price, y = carat, col = color))+
      geom_point()+
      facet_wrap(~clarity)
    }
  )

  output$downloadplot2 <- downloadHandler(
    filename = function() {
      paste('plot2', 'png', sep = ".")
    },
    content = function(file) {
      png(file)

      df1 <- data()

      ggplot(df1, aes (x = price, y = carat, col = color))+
        geom_point()+
        facet_wrap(~clarity)

      dev.off()

    }
  )

}
shinyApp(ui=ui, server = server)

现在,用户可以上传数据并获取 table 和图表,但下载按钮不起作用。我在 SO 上尝试了不同的选项和几个问题,但我无法弄清楚如何让下载按钮工作。

任何建议将不胜感激?

您的 CSV 下载问题是 df2 此时不可用。您需要生成它。

output$downloadtable <- downloadHandler(
  filename = function() {
    paste('stats', '.csv', sep='')
  },
  content = function(file) {
    df1 <- data()

    df2 <- df1 %>% 
      dplyr::select(cut, color, price) %>% 
      dplyr::group_by(cut, color) %>% 
      dplyr::summarise_each(funs(
        min(.),
        mean(.), 
        median(.),
        max(.),
        sd(.), 
        n() 
      ))  

    write.csv(df2, file)
  }
)

你的情节的问题是你需要 print 它们(并设置内容类型)。

output$downloadplot1 <- downloadHandler(
  filename <- function() {
    paste('plot1', 'png', sep = ".")
  },
  content <- function(file) {
    png(file)

    df1 <- data()

    plot <- ggplot(df1, aes (x =carat, y = price, col = color))+
      geom_point()+
      facet_wrap(~cut) 

    print(plot)

    dev.off()
  },
  contentType = "image/png"
)