Как развернуть блестящее приложение на shinyapps.io из плана Drake

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

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

Я хотел бы развернуть приложение 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

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


person David Lucey    schedule 14.07.2020    source источник
comment
Вы можете использовать этот тег: stackoverflow.com/questions/tagged/drake-r-package; наш тег для селезня выглядит не так, как вы хотите;) stackoverflow.com/questions/tagged/drake   -  person Eric Cousineau    schedule 15.07.2020


Ответы (1)


Теперь, когда я вижу, как вы развертываете приложение, я могу сказать, что это ожидаемое поведение. Да, у вашего 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)

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

Без этих файловых маркеров есть вероятность, что drake развернет приложение до того, как данные будут готовы к работе.

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)

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

person landau    schedule 15.07.2020
comment
Итак, чтобы быть нечетким, но не передавать file_in функции custom_shiny_deployment () в drake_plan? вместо этого: (1) сохранить cars_data на диск, скажем, как RDS с file_out как строку в drake_plan, (2) вернуть cars_data с диска с file_in в custom_shiny_deployment () env (3) передать в параметр deployApp appFiles изнутри env custom_shiny_development ()? - person David Lucey; 15.07.2020
comment
Да, это должно сработать. rsconnect::deployApp() требуется только имя файла данных, поэтому нет необходимости перечитывать сами данные. Считывание данных из хранилища должно быть обязанностью приложения. - person landau; 15.07.2020
comment
Таким образом, если я сохраню на диск из drake_plan, а затем повторно загружу библиотеки и данные с диска в app.R как совершенно отдельную среду, все будет работать. Он работает с параметром appFiles (), установленным в NULL, и без помощника file_out () или custom_shiny_deployment (). Я думал о данных и env, протекающих в drake_plan. Я не уверен, что это то, что вы советовали, но я не мог понять этого, поэтому придется оставить это для кого-то более знающего. Отправка ответа. - person David Lucey; 16.07.2020
comment
См. Новую редакцию моего ответа. Я думаю, что в нем подробно описаны детали. - person landau; 16.07.2020
comment
Это работает, большое спасибо за добавление, и объяснение очень помогает понять, как это работает. - person David Lucey; 16.07.2020