Блестящая загрузкаButton() и загрузкаHandler() 500 Ошибка

Я разработал Shiny Dashboard, у меня есть несколько фреймов данных, которые импортируются через реактивные программы чтения файлов и т. д. Я также добавил кнопку «Создать PDF», используя downloadButton() в моем коде ui.R. Мой код server.R реализует downloadHandler() для обработки этого запроса.

На моем рабочем столе Windows все работает отлично. Я хочу, чтобы это работало на сервере Linux, который я настроил. Конечно, мне пришлось изменить некоторые пути, и Shiny Server работает на этом компьютере с правами root. Когда я нажимаю кнопку «Создать PDF» на сайте, работающем на сервере Linux, я почти мгновенно получаю ошибку HTTP 500. Я вручную скомпилировал файл pdfReport.Rmd на сервере Linux, и он отлично работает.

Я предполагаю одно из двух:

  1. Каким-то образом данные не передаются в Linux так же, как на рабочем столе Windows. Вероятно, это маловероятно, но это возможно.
  2. У меня что-то не так с моими путями, поэтому, когда временные файлы записываются для начала создания 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, он работает неправильно. Любая помощь приветствуется. Заранее спасибо!


person azdatasci    schedule 16.02.2017    source источник


Ответы (1)


Хорошо, после долгих поисков и устранения неполадок я понял, что некоторые из файлов, которые у меня были в блестящем веб-каталоге, которые были зависимостями для основного файла pdfReport.Rmd, не были видны, поскольку код копировал отчет во временный каталог.

Поскольку я не хотел копировать все файлы из моего веб-каталога во временный каталог, я решил сделать отчет рендерингом в самом корневом каталоге. Для меня это не имеет большого значения, так как мое блестящее приложение все равно работает с правами root.

Я исправлю это сейчас, когда оно у меня работает, в основном мое исправление будет заключаться в следующем:

  1. Запустите службу как обычный пользователь
  2. Вместо копирования файлов, от которых зависит отчет, мне придется статически ссылаться на них в коде отчета.

Я извиняюсь перед всеми теми, кто, возможно, читал это и работает над этим. Мое исправление заключалось в том, что приведенный выше код был следующим:

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).

        report <- file.path(getwd(), "pdfReport.Rmd")
        #tempReport <- file.path(tempdir(), "pdfReport.Rmd")
        #file.copy("pdfReport.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(report, output_file = file, params = params, envir = new.env(parent = globalenv())
        )
      }
    )

  })

Обратите внимание, что вместо копирования файла во временный каталог я просто указываю файл в текущем рабочем каталоге.

person azdatasci    schedule 16.02.2017