Проблема при сохранении графика из реактивных входов в R блестящий - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу сохранить графики в моем приложении R Shiny, но оно не работает. У меня есть только пустой файл, и я не знаю, как это исправить. Это базовая блестящая конструкция, сделанная шаг за шагом, следуя инструкциям, так что я думаю, вам будет легко ее понять. Вот мой код:

ui.R '' '

    ui <- navbarPage(

           navbarMenu("Times series",
                        tabPanel("Abiotiques",
                                  selectInput("Time_Series", p(strong("Which parameters do you want
                                  to plot as time serie?")), 
                                    choices = list("Temperature", "Salinity", "O2")),

                                  selectInput("Station", p(strong("Which station do you want to
                                                                  plot as time serie?")),
                                              choices = list("120","130","215","230","330",
                                                             "700","710","780","ZG02")),


                                  mainPanel(plotOutput("TS", height = 550),
                                            downloadButton("foo", "Download plot"))) 

                     )

' ''

server.R

 shinyServer <-  function(input, output) {

selectDate <- reactive({
 switch(input$Station,
            "120" = filter(s120, Time >=input$dateRangeTS[1] & Time<=input$dateRangeTS[2]),
            "130" = filter(s130, Time >=input$dateRangeTS[1] & Time<=input$dateRangeTS[2]),
            "215" = filter(s215, Time >=input$dateRangeTS[1] & Time<=input$dateRangeTS[2]),
            "230" = filter(s230, Time >=input$dateRangeTS[1] & Time<=input$dateRangeTS[2]),
            "330" = filter(s330, Time >=input$dateRangeTS[1] & Time<=input$dateRangeTS[2]),
            "700" = filter(s700, Time >=input$dateRangeTS[1] & Time<=input$dateRangeTS[2]),
            "710" = filter(s710, Time >=input$dateRangeTS[1] & Time<=input$dateRangeTS[2]),
            "780" = filter(s780, Time >=input$dateRangeTS[1] & Time<=input$dateRangeTS[2]),
            "ZG02" = filter(sZG02, Time >=input$dateRangeTS[1] & Time<=input$dateRangeTS[2]))

                      })

output$TS <- renderPlot({ y <- switch(input$Time_Series, "Temperature" = ggplot(data = selectDate(), aes(x = Time, y = Temperature), ) + geom_point(color = "#00AFBB", size = 2) + labs(x = "Time", y = "Temperature") + scale_x_date(labels = date_format("%Y-%m-%d")) + ylim(0, 25),

        "Salinity" = ggplot(data = selectDate(), aes(x = Time, y = Salinite), ) +
          geom_point(color = "#00AFBB", size = 2) + labs(x = "Time", y = "Salinité") +
          scale_x_date(labels = date_format("%Y-%m-%d")) + ylim(27, 37),

        "O2" = ggplot(data = selectDate(), aes(x = Time, y = `O2 (mg/L)`), ) +
          geom_point(color = "#00AFBB", size = 2) + labs(x = "Time", y = "O2") +
          scale_x_date(labels = date_format("%Y-%m-%d")) + ylim(NA, 15))

          plot(y)
                  })

output$foo <- downloadHandler(
 filename = function() {
 paste("test", "png", sep=".")

 },

 content = function(file) {

 if(input$Time_Series == "Temperature")
   png(file)
   print(ggplot(data = selectDate(), aes(x = Time, y = Temperature), ) +
   geom_point(color = "#00AFBB", size = 2) + labs(x = "Time", y = "Temperature") +
   scale_x_date(labels = date_format("%Y-%m-%d")) + ylim(0, 25))


 if(input$Time_Series == "Salinity")
   png(file)
   print(ggplot(data = selectDate(), aes(x = Time, y = Salinite), ) +
     geom_point(color = "#00AFBB", size = 2) + labs(x = "Time", y = "Salinité") +
     scale_x_date(labels = date_format("%Y-%m-%d")) + ylim(27, 37))

 if(input$Time_Series == "O2")
   png(file)
   print(ggplot(data = selectDate(), aes(x = Time, y = `O2 (mg/L)`), ) +
     geom_point(color = "#00AFBB", size = 2) + labs(x = "Time", y = "O2") +
     scale_x_date(labels = date_format("%Y-%m-%d")) + ylim(NA, 15))

 dev.off()

   }
  )
  }

Большое спасибоза вашу помощь!

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Сделайте свой график в реактивном проводнике, таким образом вам не придется дублировать код, чтобы сохранить его:

myplot <- reactive({ 
  switch(input$Time_Series, 
        "Temperature" = ggplot(data = selectDate(), aes(x = Time, y = Temperature), ) + geom_point(color = "#00AFBB", size = 2) + labs(x = "Time", y = "Temperature") + scale_x_date(labels = date_format("%Y-%m-%d")) + ylim(0, 25),

        "Salinity" = ggplot(data = selectDate(), aes(x = Time, y = Salinite), ) +
          geom_point(color = "#00AFBB", size = 2) + labs(x = "Time", y = "Salinité") +
          scale_x_date(labels = date_format("%Y-%m-%d")) + ylim(27, 37),

        "O2" = ggplot(data = selectDate(), aes(x = Time, y = `O2 (mg/L)`), ) +
          geom_point(color = "#00AFBB", size = 2) + labs(x = "Time", y = "O2") +
          scale_x_date(labels = date_format("%Y-%m-%d")) + ylim(NA, 15))
})

output$TS <- renderPlot({myplot()})

И использовать ggsave:

output$foo <- downloadHandler(
  filename = function() {
    paste("test", "png", sep=".")
  },

  content = function(file) {
    ggsave(file, myplot())
  }
)
0 голосов
/ 06 ноября 2019

Вам нужны скобки после if операторов, потому что сейчас вы делаете только png() в ifs. Также попробуйте ggsave():

output$foo <- downloadHandler(
  filename = function() {
    paste("test", "png", sep=".")

  },
  contentType = 'image/png',
  content = function(file) {

    if(input$Time_Series == "Temperature") {
      p <- ggplot(data = selectDate(), aes(x = Time, y = Temperature), ) +
        geom_point(color = "#00AFBB", size = 2) +
        labs(x = "Time", y = "Temperature") +
        scale_x_date(labels = date_format("%Y-%m-%d")) +
        ylim(0, 25)
    } else if (input$Time_Series == "Salinity") {
      p <- ggplot(data = selectDate(), aes(x = Time, y = Salinite), ) +
        geom_point(color = "#00AFBB", size = 2) +
        labs(x = "Time", y = "Salinité") +
        scale_x_date(labels = date_format("%Y-%m-%d")) +
        ylim(27, 37)
    } else if (input$Time_Series == "O2") {
      p <- ggplot(data = selectDate(), aes(x = Time, y = `O2 (mg/L)`), ) +
        geom_point(color = "#00AFBB", size = 2) + labs(x = "Time", y = "O2") +
        scale_x_date(labels = date_format("%Y-%m-%d")) +
        ylim(NA, 15)
    }

    if (exists('p')) {
      # ggsave() guesses it's png from the file extension
      ggsave(file, p)
    }
  }
)
...