Как развернуть блестящее приложение на shinyapps.io из плана Drake - PullRequest
0 голосов
/ 14 июля 2020

Это следующий вопрос после закрытия l oop при передаче приложения и данных в функцию развертывания Shiny:

Как использовать блестящее приложение в качестве цели в Drake

Я хотел бы развернуть приложение Shiny непосредственно из плана Drake, как показано ниже.

library(drake)
library(shiny)

plan <- drake_plan(
  cars_data = mtcars,
  deployment = custom_deployment_function(file_in("app.R"), cars_data)
)

custom_shiny_deployment <- function(file, data_input) {

    rsconnect::deployApp(
    appFiles = file,
    appName = "cars",
    forceUpdate = TRUE
  )
}

Saved as "app.R" in project working directory (the app works outside of drake if data_input <- mtcars) :

shinyApp(
  ui = fluidPage(
    selectInput("variable", "Variable:",
                c("Cylinders" = "cyl",
                  "Transmission" = "am")),
    tableOutput("data")
  ),
  server = function(input, output) {
    output$data <- renderTable({
      data_input[, c("mpg", input$variable), drop = FALSE]
    }, rownames = TRUE)
  }
)

Журналы с shinyapps.io показывают, что "cars_data" от drake не передается в Shiny сервер "data_input" в среде custom_deployment_function:

2020-07-14T20:12:57.418989+00:00 shinyapps[2569696]: htmltools version: 0.5.0
2020-07-14T20:12:57.419186+00:00 shinyapps[2569696]: Using pandoc: /opt/connect/ext/pandoc2
2020-07-14T20:12:57.589960+00:00 shinyapps[2569696]: Using jsonlite for JSON processing
2020-07-14T20:12:57.593223+00:00 shinyapps[2569696]: 
2020-07-14T20:12:57.593224+00:00 shinyapps[2569696]: Starting R with process ID: '25'
2020-07-14T20:12:57.628389+00:00 shinyapps[2569696]: 
2020-07-14T20:12:57.628390+00:00 shinyapps[2569696]: Listening on http://127.0.0.1:38608
2020-07-14T20:13:14.686424+00:00 shinyapps[2569696]: Running on host: e89f96d02b6e
2020-07-14T20:13:14.691423+00:00 shinyapps[2569696]: Server version: 1.8.4-11
2020-07-14T20:13:14.691436+00:00 shinyapps[2569696]: LANG: en_US.UTF-8
2020-07-14T20:13:14.691436+00:00 shinyapps[2569696]: R version: 4.0.0
2020-07-14T20:13:14.691437+00:00 shinyapps[2569696]: shiny version: 1.5.0
2020-07-14T20:13:14.691467+00:00 shinyapps[2569696]: rmarkdown version: (none)
2020-07-14T20:13:14.691648+00:00 shinyapps[2569696]: Using pandoc: /opt/connect/ext/pandoc2
2020-07-14T20:13:14.691475+00:00 shinyapps[2569696]: knitr version: (none)
2020-07-14T20:13:14.857243+00:00 shinyapps[2569696]: Using jsonlite for JSON processing
2020-07-14T20:13:14.691443+00:00 shinyapps[2569696]: httpuv version: 1.5.4
2020-07-14T20:13:14.895595+00:00 shinyapps[2569696]: 
2020-07-14T20:13:14.691480+00:00 shinyapps[2569696]: jsonlite version: 1.7.0
2020-07-14T20:13:14.860404+00:00 shinyapps[2569696]: 
2020-07-14T20:13:14.860404+00:00 shinyapps[2569696]: Starting R with process ID: '41'
2020-07-14T20:13:14.895596+00:00 shinyapps[2569696]: Listening on http://127.0.0.1:42022
2020-07-14T20:13:14.691496+00:00 shinyapps[2569696]: RJSONIO version: (none)
2020-07-14T20:13:14.691506+00:00 shinyapps[2569696]: htmltools version: 0.5.0
2020-07-14T20:15:57.441648+00:00 shinyapps[2569696]: Running on host: a2e664ad9837
2020-07-14T20:15:57.447236+00:00 shinyapps[2569696]: Server version: 1.8.4-11
2020-07-14T20:15:57.447326+00:00 shinyapps[2569696]: R version: 4.0.0
2020-07-14T20:15:57.447337+00:00 shinyapps[2569696]: knitr version: (none)
2020-07-14T20:15:57.447337+00:00 shinyapps[2569696]: rmarkdown version: (none)
2020-07-14T20:15:57.447327+00:00 shinyapps[2569696]: shiny version: 1.5.0
2020-07-14T20:15:57.447260+00:00 shinyapps[2569696]: LANG: en_US.UTF-8
2020-07-14T20:15:57.447337+00:00 shinyapps[2569696]: httpuv version: 1.5.4
2020-07-14T20:15:57.447338+00:00 shinyapps[2569696]: jsonlite version: 1.7.0
2020-07-14T20:15:57.447338+00:00 shinyapps[2569696]: RJSONIO version: (none)
2020-07-14T20:15:57.667089+00:00 shinyapps[2569696]: 
2020-07-14T20:15:57.447494+00:00 shinyapps[2569696]: Using pandoc: /opt/connect/ext/pandoc2
2020-07-14T20:15:57.630039+00:00 shinyapps[2569696]: Starting R with process ID: '24'
2020-07-14T20:15:57.626886+00:00 shinyapps[2569696]: Using jsonlite for JSON processing
2020-07-14T20:15:57.447347+00:00 shinyapps[2569696]: htmltools version: 0.5.0
2020-07-14T20:15:57.630037+00:00 shinyapps[2569696]: 
2020-07-14T20:15:57.667090+00:00 shinyapps[2569696]: Listening on http://127.0.0.1:40107
2020-07-14T20:16:14.758082+00:00 shinyapps[2569696]: Warning: Error in renderTable: object 'data_input' not found
2020-07-14T20:16:14.772348+00:00 shinyapps[2569696]:   108: renderTable [/srv/connect/apps/cars/app.R#13]
2020-07-14T20:16:14.772349+00:00 shinyapps[2569696]:   107: func
2020-07-14T20:16:14.772350+00:00 shinyapps[2569696]:    94: origRenderFunc
2020-07-14T20:16:14.772350+00:00 shinyapps[2569696]:    93: output$data
2020-07-14T20:16:14.772350+00:00 shinyapps[2569696]:    13: runApp
2020-07-14T20:16:14.772351+00:00 shinyapps[2569696]:    12: fn
2020-07-14T20:16:14.772351+00:00 shinyapps[2569696]:     7: connect$retry
2020-07-14T20:16:14.772352+00:00 shinyapps[2569696]:     6: eval
2020-07-14T20:16:14.772352+00:00 shinyapps[2569696]:     5: eval

Извините, если это тривиально, но между селезнем и блестящим, он ускользает от меня.

1 Ответ

1 голос
/ 15 июля 2020

Теперь, когда я вижу, как вы развертываете приложение, я могу сказать, что это ожидаемое поведение. Да, ваш custom_shiny_deployment() имеет доступ к данным, но развернутое приложение не имеет доступа, потому что rsconnect::deployApp() не отправляет объекты из вызывающей среды. Если вы хотите, чтобы данные были доступны для приложения, я рекомендую сохранить их (и отслеживать с помощью file_in() и file_out()), а затем передать их в аргумент appFiles для deployApp() через custom_shiny_deployment().

РЕДАКТИРОВАТЬ

Ваш app.R может оставаться таким, какой он есть.

app.R то же самое, что вы написали.

library(shiny)

cars_data <- readRDS("cars_data.RDS")

shinyApp(
  ui = fluidPage(
    selectInput("variable", "Variable:",
                c("Cylinders" = "cyl",
                  "Transmission" = "am")),
    tableOutput("data")
  ),
  server = function(input, output) {
    output$data <- renderTable({
      cars_data[, c("mpg", input$variable), drop = FALSE]
    }, rownames = TRUE)
  } 
)

Но с drake, вам нужно что-то вроде file_in() и file_out(), чтобы гарантировать, что правильные цели работают в правильном порядке и в ответ на изменения в cars_data.RDS и app.R.

library(drake)

plan <- drake_plan(
  cars_data = mtcars,
  save_cars = saveRDS(cars_data, file_out("cars_data.RDS")),
  deployment = rsconnect::deployApp(
    appFiles = file_in("app.R", "cars_data.RDS"),
    appName = "cars",
    forceUpdate = TRUE
  )
)

make(plan)

Если вы действительно хотите, чтобы appFiles было NULL, drake по-прежнему требуется file_in(), чтобы он знал, что зависит от физических файлов.

plan <- drake_plan(
  cars_data = mtcars,
  save_cars = saveRDS(cars_data, file_out("cars_data.RDS")),
  deployment = deploy_app(file_in("cars_data.RDS", "app.R"))
)

deploy_app <- function(...) {
  rsconnect::deployApp(
    appFiles = NULL,
    appName = "cars",
    forceUpdate = TRUE
  )
}

В любом случае, я рекомендую проверить план с помощью plot() или vis_drake_graph() перед запуском с make(). Оба плана выше показывают deployment ниже по потоку от файла данных (с входящими стрелками), что именно то, что нам нужно.

plot(plan)

enter image description here

Without these file markers, there is a chance that drake will deploy the app before the data is ready to go.

disconnected_plan <- drake_plan(
  cars_data = mtcars,
  saveRDS(cars_data, "cars_data.RDS"),
  deployment =  rsconnect::deployApp(
    appFiles = NULL,
    appName = "cars",
    forceUpdate = TRUE
  )
)

plot(disconnected_plan)

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...