如何基于eventReactive写一个文件

How to write a file based on eventReactive

我的应用程序允许用户生成一些图并将它们保存为 png。

我还希望应用程序根据用户在应用程序中所做的一些输入来更新 csv 文件。

出于示例目的,我创建了一个玩具应用程序,它在给定文件夹中生成一个 csv 文件。

在这两种情况下,应用程序都不会显示任何错误消息或信息,但不会在任何地方存储任何文件。

library(shiny)
library(ggplot2)
library(AlphaPart)

ui <- fluidPage(
  selectInput("var1","Select var1", choices = names(iris)),
  selectInput("var2","Select var2", choices = names(iris)),
  plotOutput("myplot"),
  downloadLink("downloadPlot", label = icon("download")))

server <- function(input, output, session) {
  
  data <- reactive(iris)
  var1 <- reactive({input$var1})
  var2 <- reactive({input$var2})
  
  # Genearte plot
  draw_boxplot <- function(data, var1, var2){
    ggplot(data=data(), aes(x=.data[[input$var1]], y = .data[[input$var2]]))+
      geom_boxplot() 
  }
  
  plot1 <- reactive({
    req(data(), input$var1, input$var2)
    draw_boxplot(data(), var1(), var2())
  })
  
  output$myplot <- renderPlot({
    plot1()
  })
  
  #Download
  output$downloadPlot <- downloadHandler(
    filename = function() {
      return("Plot.png")
    },
    content = function(file) {
      png(file)
      print(plot1())
      dev.off()
    })
  
  #Write csv
  
  eventReactive(input$downloadPlot, {
    dat <- as.data.frame(c(input$num_var_1, input$num_var_2))
    write.csv(dat, "C:/dat.csv", row.names = FALSE)
  })
  }

shinyApp(ui, server)
library(shiny)
library(ggplot2)
library(AlphaPart)
library(spsComps)


ui <- fluidPage(
    selectInput("var1","Select var1", choices = names(iris)),
    selectInput("var2","Select var2", choices = names(iris)),
    plotOutput("myplot"),
    downloadLink("downloadPlot", label = icon("download")))

server <- function(input, output, session) {
    
    data <- reactive(iris)
    var1 <- reactive({input$var1})
    var2 <- reactive({input$var2})
    
    # Genearte plot
    draw_boxplot <- function(data, var1, var2){
        ggplot(data=data(), aes(x=.data[[input$var1]], y = .data[[input$var2]]))+
            geom_boxplot() 
    }
    
    plot1 <- reactive({
        req(data(), input$var1, input$var2)
        draw_boxplot(data(), var1(), var2())
    })
    
    output$myplot <- renderPlot({
        plot1()
    })
    
    #Download
    downloaded <- reactiveVal(0)
    output$downloadPlot <- downloadHandler(
        filename = function() {
            return("Plot.png")
        },
        content = function(file) {
            png(file)
            print(plot1())
            dev.off()
            on.exit({spsComps::incRv(downloaded)})
        })
    #Write csv
    observeEvent(downloaded(), {
        dat <- as.data.frame(c(input$num_var_1, input$num_var_2))
        utils::write.csv(dat, "dat.csv", row.names = FALSE)
        print("File saved")
    }, ignoreInit = TRUE)
}

shinyApp(ui, server)
  1. 很遗憾,您无法观察下载事件。所以我们在这里介绍另一个 reactiveVal,我们可以在下载事件中更改它,以便我们知道下载按钮是否已被单击。
  2. spsComps::incRvdownloaded(isolate(downloaded()) + 1) 的简写函数,因此它每次将 reactiveVal 加一。
  3. 在最后使用on.exit以确保只有在情节成功时才会发生这种情况。
  4. 不应使用 eventReactive,而应使用 observeEvent,因为您不会返回任何值,而只是写入一个文件。