#r #shiny
Вопрос:
Я пытался решить проблему при разработке одного из моих первых приложений R Shiny. Мое приложение работает на моем ноутбуке, но я не могу заставить его работать, когда загружаю его на блестящий сервер. Я хочу, чтобы приложение создало временный файл диаграммы рассеяния, plotOut, на сервере, который затем экспортируется в файл Excel либо при нажатии кнопки «Загрузить диаграмму рассеяния», либо автоматически. Я публикую свою лучшую попытку репрекса ниже. Я считаю, что мне нужно каким-то образом использовать tempdir (), но не уверен, как это сделать. Заранее спасибо 😀
«ui.R»
library(tidyverse) library(openxlsx) ui lt;- fluidPage( fluidRow("This is a simplified app to reproduce the difficulties in saving and downloading files on the Shiny server", plotOutput("plot", height = 350), downloadButton('downloadPlot1', "Download ScatterPlot"), downloadButton( 'dl_excel', 'Download Results (.xlsx)' ) ) )
«сервер.R»
server lt;- function(input, output){ ###create basic plot in ggplot plotOut lt;- reactive( ggplot(mtcars, aes(x=wt, y=mpg)) geom_point() ) ###display plot output$plot lt;- renderPlot({ plotOut() }) #temp = tempdir() #tried using this in filename to no avail fName = paste0('plotOut', Sys.Date(), '.png') ##save plot file as png output$downloadPlot1 lt;- downloadHandler( filename = function(){fName}, content = function(file){ ggsave(file,plot=plotOut()) }) ##format excel file for output output$dl_excel lt;- downloadHandler( filename = function(){ paste0('results_', Sys.Date(), '.xlsx') }, content = function(file){ my_workbook lt;- createWorkbook() addWorksheet( wb = my_workbook, sheetName = "Sheet1" ) insertImage(my_workbook, sheet = 1, file = fName , width = 4, height = 4, startRow = 1, startCol = 1, units = "in", dpi = 300 ) saveWorkbook(my_workbook, file) } ) }
Ответ №1:
Кто-то на другом форуме помог мне решить эту проблему. Обновление кода до следующего устраняет проблему.
output$dl_excel lt;- downloadHandler( filename = function() { paste0('results_', Sys.Date(), '.xlsx') }, content = function(file) { **tempPNG lt;- tempfile(fileext = ".png") #create a tempfile to print the plot to ggsave(tempPNG, plot = plotOut()) #print the plot to the tempfile** my_workbook lt;- createWorkbook() addWorksheet(wb = my_workbook, sheetName = "Sheet1") insertImage( my_workbook, sheet = 1, **file = tempPNG, #use the tempfile** width = 4, height = 4, startRow = 1, startCol = 1, units = "in", dpi = 300 ) saveWorkbook(my_workbook, file) } )