одновременное использование downloadHandler и renderPlot в статической функции

Пожалуйста, примите во внимание следующее:

# createPlot takes in data, processes it and generates a plot using native plot()
    plotInput <- function(){       
     createPlot(data=data(),name=input$name)
    }

# I render it using
output$plot <- renderPlot({
    plotInput()
  }, height=700,width=850,res=100)

# and I download the pdf using
output$pdflink <- downloadHandler(
      filename <- "plot.pdf",
      content <- function(file){
        pdf("plot.pdf")
        print(plotInput())
        dev.off()
        file.copy("plot.pdf", file)
      }
  )

createPlot функция имеет коэффициент randomising, который заполняет пустые значения небольшим случайным псевдосчетом. Итак, всякий раз, когда эта функция запускается, точки на графике не совсем совпадают, поэтому загруженный график немного отличается от того, что я вижу в интерфейсе. Что я могу сделать, чтобы обойти эту проблему?

Я пробовал сохранить вывод plotInput() в статической переменной и повторно использовать эту переменную как для рендеринга, так и для экспорта, но это не работает.

mainPlot <- plotInput()

person Sukhi    schedule 08.02.2016    source источник


Ответы (2)


Вместо того, чтобы делать plotInput функцию, попробуйте превратить ее в «реактивную». Shiny должен обнаружить, что при печати в файл нет необходимости повторно запускать реактивный объект, если ни один из его входов не изменился, и поэтому renderPlot и pdf должны использовать один и тот же график.

person CPhil    schedule 08.02.2016
comment
Спасибо за Ваш ответ. plotInput раньше у меня была как реактивная функция, но проблема заключалась в том, что во время загрузки сюжет не генерировался, и это все еще так. Итак, если я конвертирую plotInput в реактивную функцию, downloadHandler вернет файл, но он будет пустым. Сюжет не сформирован. - person Sukhi; 09.02.2016

Я решил это, создав статический график pdf, который я преобразовал в .png, используя ImageMagick, и отрендерил преобразованное изображение в браузере, используя renderImage

# createPlot takes in data, processes it and generates a plot using native plot()
    plotInput <- reactive({       
     createPlot(data=data(),name=input$name)
    })

# I render it using
    output$plot <- renderImage({
     pdf("plot.pdf")
     print(plotInput())
     dev.off
# R wrapper for imagemagick
   im.convert('plot.pdf',output='plot.png',extra.opts="-density 250 -quality 100")
    list(src='plot.png',
     contentType='image/png',
     alt='emptyPlot')
   },deleteFile=FALSE)

# and I download the pdf using
    output$pdflink <- downloadHandler(
      filename <- "plot.pdf",
      content <- function(file){
        file.copy("plot.pdf", file)
      }
    )
person Sukhi    schedule 09.02.2016