0

如何将前一个目标 ( df) 传递给我在下一个命令中使用的ui函数。我的计划是这样的:servershinyApp

plan <- drake_plan(
  df = faithful,
  app = shinyApp(ui, server)
)

uiserver闪亮的教程中复制。只有一个区别 - 我改为faithfuldf上一个目标中的数据)。现在我收到一个错误:

Warning: Error in $: object of type 'closure' is not subsettable
  [No stack trace available]

如何解决这个问题?最佳做法是什么?

4

1 回答 1

1

drake目标应该返回可以存储的固定数据对象saveRDS()(或者如果您使用专门的格式,则返回其他类型的文件)。我建议看看https://books.ropensci.org/drake/plans.html#how-to-choose-good-targets。将 Shiny 应用程序的运行实例定义为目标存在问题。

  1. 只要应用程序在运行,make()就永远不会结束。
  2. shinyApp()将 的返回值保存为数据对象并没有真正意义。这并不是目标的真正用途。目标的目的是可重复地缓存长时间计算的结果,因此除非某些上游代码或数据发生更改,否则您无需重新运行它。

相反,我认为应用目标的目的应该是部署到像https://shinyapps.io这样的网站。要在df更改时更新应用程序,请务必df在命令中将其作为符号提及,以便drake静态代码分析器可以获取它。此外,用于file_in()将 Shiny 应用程序脚本声明为依赖项,以便drake在代码更改时自动重新部署应用程序。

library(drake)

plan <- drake_plan(
  df = faithful,
  deployment = custom_deployment_function(file_in("app.R"), df)
)

custom_deployment_function <- function(file, ...) {
  rsconnect::deployApp(
    appFiles = file,
    appName = "your_name",
    forceUpdate = TRUE
  )
}

此外,请务必检查依赖关系图,以便您知道drake将以正确的顺序运行正确的目标。

vis_drake_graph(plan)

在此处输入图像描述

在您之前的计划中,应用程序的命令没有提到符号df,因此drake不知道它需要先运行一个。

plan <- drake_plan(
  df = faithful,
  app = shinyApp(ui, server)
)
vis_drake_graph(plan)

在此处输入图像描述

于 2020-04-22T13:34:34.710 回答