闪亮:下载表格数据和情节

时间:2016-11-17 22:55:18

标签: r csv download shiny png

我正在学习shiny,并且我正在创建一个应该让用户能够执行的闪亮应用:

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

2-获取统计数据和情节

3-将表格数据下载为.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)

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

任何建议都会受到高度赞赏吗?

1 个答案:

答案 0 :(得分:3)

您的CSV下载问题是line此时无法使用。你需要生成它。

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