如何从Shiny下载对象?

时间:2019-01-10 20:38:41

标签: r shiny

在尝试实现一个有光泽的应用程序的简单downloadButton的几个问题之后,我只是尝试实现了我发现的一个testplo。

来源:https://www.youtube.com/watch?v=Y5arqZ9Bp0A

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("ngear", "Select the gear number", c("1"="cyl","2"="am","3"="gear"))
    ),
    mainPanel(
      plotOutput("plot"),
      downloadButton("report","download"))
  )
)

server <- function(input, output) {
   mtreact <- reactive({
     mtcars[,c("mpg",input$ngear)]
   })

   output$plot <- renderPlot({
      with(mtreact(),boxplot(mpg~mtreact()[,2]))
   })

   output$report <- downloadHandler(
     filename = function(){
       paste("plot","png",sep=".")
     },
     content = function(){
       png(file)
       with(mtreact(),boxplot(mpg~mtreact()[,2]))
       dev.off
     }
   )
}

# Run the application 
shinyApp(ui = ui, server = server)

当我运行此代码时,闪亮的应用程序将正常运行。但是,当我单击“下载”按钮时,会打开一个窗口,以保存名为“ report”的文件,不带扩展名,不包含不包含预期的图形。

这是我第一次尝试此功能。然后,有人在代码上看到任何错误吗?

2 个答案:

答案 0 :(得分:0)

您的downloadHandler应该在content上接受文件名

   output$report <- downloadHandler(
     filename = function(){
       paste("plot","png",sep=".")
     },
     content = function(file){
                        ^^^^
       png(file)
       with(mtreact(),boxplot(mpg~mtreact()[,2]))
       dev.off
     }
   )

第二,filename函数返回一个建议,该建议用于下载对话框。但是,这在RStudio的应用查看器中无法正确执行(当您在RStudio中单击“运行应用”时会出现该视图)。尝试在适当的浏览器(例如Chrome)中运行该应用,以检查其是否正确响应。

答案 1 :(得分:0)

正如MrGumble和MrFlick指出的那样,代码包含两个错误:function( file )和dev.of **()**

以下代码按预期生成报告。

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("ngear", "Select the gear number", c("1"="cyl","2"="am","3"="gear"))
    ),
    mainPanel(
      plotOutput("plot"),
      downloadButton("report","download"))
  )
)

server <- function(input, output) {
   mtreact <- reactive({
     mtcars[,c("mpg",input$ngear)]
   })

   output$plot <- renderPlot({
      with(mtreact(),boxplot(mpg~mtreact()[,2]))
   })

   output$report <- downloadHandler(
     filename = function(){
       paste("plot","png",sep=".")
     },
     content = function(file){
       png(file)
       with(mtreact(),boxplot(mpg~mtreact()[,2]))
       dev.off()
     }
   )
}

感谢MrFlick和MrGumble的帮助。