ice*_*erg 4 arguments r function global-variables shiny
我正在构建一个 R 包,它具有启动闪亮应用程序的功能。我希望该函数包含一个要传递给应用程序的参数。我发现唯一有效的方法是设置一个全局值,然后让应用程序使用该全局值:
launch_app <- function(MonteCarlo=1000){
MonteCarlo_global <<- MonteCarlo
shiny::runApp(appDir = system.file("app.R", package="my_package"))
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来传递我的“蒙特卡洛”参数以在整个闪亮的应用程序中使用?请注意,我试图避免简单地将“MonteCarlo”作为应用程序本身的输入选项之一。我宁愿让用户不用担心这个问题。但是,如果需要,知识渊博的用户可以在启动应用程序时控制它。
我目前使用shinyOptions和getShinyOption将参数传递给闪亮的应用程序。
另外,我直接source输出shinyApp而不是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
}
Run Code Online (Sandbox Code Playgroud)
该文件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
}
)
Run Code Online (Sandbox Code Playgroud)
仅setwd()当您在server.
在这里您还可以找到创始人 Joe Cheng 对于这个话题的看法shiny。
你是对的,“标准”方法是使用runApp,但我选择不这样做有两个原因:
首先,runApp将保存server全局环境中的所有变量。这意味着在应用程序停止后,程序包的用户将在其工作区中拥有他们不需要的变量。如果您使用我概述的设计,则运行该应用程序不会影响您的用户环境。
launch_app其次,通过这样编写函数,您可以通过shiny-server这样轻松地部署应用程序
## file: /srv/shiny-server/my-pkg/app.R
my_pkg::lauch_app(MonteCarlo = 800)
Run Code Online (Sandbox Code Playgroud)
launch_app如果调用则不可能runApp。使用这种runApp方法,您需要使用指向应用程序文件夹的符号链接,这将导致更多的维护工作(例如,如果.libPaths或结构发生inst/变化)。此外,您将无法shiny-server轻松地将参数传递给应用程序的版本