Я разработал Shiny Dashboard, у меня есть несколько фреймов данных, которые импортируются через реактивные программы чтения файлов и т. д. Я также добавил кнопку «Создать PDF», используя downloadButton() в моем коде ui.R. Мой код server.R реализует downloadHandler() для обработки этого запроса.
На моем рабочем столе Windows все работает отлично. Я хочу, чтобы это работало на сервере Linux, который я настроил. Конечно, мне пришлось изменить некоторые пути, и Shiny Server работает на этом компьютере с правами root. Когда я нажимаю кнопку «Создать PDF» на сайте, работающем на сервере Linux, я почти мгновенно получаю ошибку HTTP 500. Я вручную скомпилировал файл pdfReport.Rmd на сервере Linux, и он отлично работает.
Я предполагаю одно из двух:
- Каким-то образом данные не передаются в Linux так же, как на рабочем столе Windows. Вероятно, это маловероятно, но это возможно.
- У меня что-то не так с моими путями, поэтому, когда временные файлы записываются для начала создания PDF, у системы нет возможности или пути для записи файла не существует. Возможно, мой код downloadHandler() каким-то образом искажен. Я думаю, что это более высокая вероятность, чем № 1.
Вот мой код для downloadHandler():
output$pdfReport <- downloadHandler(
# For PDF output, change this to "report.pdf"
filename = reactive({paste0("/srv/shiny-server/itpod/","ITPOD-",Sys.Date(),".pdf")}),
content = function(file) {
# Copy the report file to a temporary directory before processing it, in
# case we don't have write permissions to the current working dir (which
# can happen when deployed).
tempReport <- file.path("/srv/shiny-server/itpod", "pdfReport.Rmd")
file.copy("report.Rmd", tempReport, overwrite = TRUE)
params <- list(ilp=updateILP(), ico=updateICO(), sec=updateSecurity(), ppwc=updateWorkPreviousPeriodCompleted(),
pow=updateOngoingWorkCABApproved(), pwcr=updatePlannedWorkCABRequested(), epca=updateEmergencyChangesPendingCABApproval(),
fac=updateFacilities(), drs=updateDRStatus(), ov=updateOperationalEvents(), sl=updateStaffLocations(),
w = updateWeather())
# Knit the document, passing in the `params` list, and eval it in a
# child of the global environment (this isolates the code in the document
# from the code in this app).
rmarkdown::render(tempReport, output_file = file, params = params, envir = new.env(parent = globalenv())
)
}
)
Я подумал, что путь просто не доступен для записи, поэтому я попытался изменить его на /tmp, но это тоже не сработало. Поковырявшись, я обнаружил, что когда я нажимаю кнопку «Создать PDF», я получаю длинный URL-адрес с «сеансом»:
http://my.url.com:3838/itpod/session/d661a858f5679aba26692bc9b4442872/download/pdfReport?w=
Я начинаю задаваться вопросом, в этом ли проблема и что я не пишу путь к текущему сеансу или что-то в этом роде? Это новая область для меня с Shiny. Как я уже сказал, на моем рабочем столе он работает нормально, но как только я развертываю его на сервере Linux, он работает неправильно. Любая помощь приветствуется. Заранее спасибо!