我正在构建一个R包,该R包具有启动闪亮应用程序的功能。我希望该功能包括一个参数,要传递给应用程序。我发现工作的唯一方法是设置全局值,然后让应用程序使用该全局值:
launch_app <- function(MonteCarlo=1000){
MonteCarlo_global <<- MonteCarlo
shiny::runApp(appDir = system.file("app.R", package="my_package"))
}
是否有更好的方法可以在整个闪亮的应用程序中使用我的"蒙特卡洛"论点?请注意,我试图避免将"蒙特卡洛"作为应用本身中的输入选项之一。我宁愿让用户不用担心。但是,如果需要,知识渊博的用户可以在启动应用程序时控制它。
我当前使用 shinyOptions
和 getShinyOption
将参数传递到闪亮的应用程序。
另外,i source
直接来自 shinyApp
的输出,而不是像so
runApp
## file: R/launch_app.R
launch_app <- function(MonteCarlo = 1000){
shinyOptions(MonteCarlo = MonteCarlo)
source(system.file("app.R", package = "my_pkg", local = TRUE, chdir = TRUE))$value
}
文件app.R
看起来与此
## file: inst/app.R
appDir <- getwd()
monte.carlo.default <- 1000
MonteCarlo <- getShinyOption("MonteCarlo", monte.carlo.default)
shinyApp(
ui = fluidPage(paste("Chosen parameter:", MonteCarlo)),
server = function(input, output, session){
oldwd <- setwd(appDir)
on.exit(setwd(oldwd))
## put more server logic here
}
)
setwd()
部分仅在您使用server
内的本地路径时才相关。
在这里,您还可以找到shiny
的创建者Joe Cheng的意见。
编辑:为什么使用源代替runapp?
您是对的,"标准"方法是使用runApp
,但是我选择不这样做的原因有两个:
首先,runApp
将在全局环境中保存所有server
变量。这意味着在停止应用程序后,包装的用户将在其工作区中具有不需要的变量。如果您使用我概述的设计,则运行应用程序不会影响您的用户环境。
第二,通过像这样编写launch_app
函数,您可以通过shiny-server
轻松地部署应用程序
## file: /srv/shiny-server/my-pkg/app.R
my_pkg::lauch_app(MonteCarlo = 800)
如果launch_app
调用runApp
,则不可能。使用runApp
方法,您需要使用指向应用程序文件夹的符号链接,这将导致更多的维护工作(例如,如果.libPaths
或inst/
更改的结构(。另外,您将无法轻松地将参数传递给您的应用程序的shiny-server
版本