我正在构建一个R包,它具有启动闪亮应用程序的功能。我希望该函数包含一个传递给应用程序的参数。我发现工作的唯一方法是设置一个全局值,然后让应用程序使用该全局值:
launch_app <- function(MonteCarlo=1000){
MonteCarlo_global <<- MonteCarlo
shiny::runApp(appDir = system.file("app.R", package="my_package"))
}
有没有更好的方法来通过我的&#34; MonteCarlo&#34;在整个闪亮的应用程序中使用的参数?请注意我试图避免简单地包括&#34; MonteCarlo&#34;作为应用程序本身的输入选项之一。我宁愿让用户不要担心它。但是,如果需要,知识渊博的用户可以在启动应用程序时控制它。
答案 0 :(得分:0)
我目前使用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
}
文件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
部分才有意义。
Here您还可以找到shiny
的创建者Joe Cheng关于此主题的意见。
你是对的,“标准”方式是使用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
方法,您需要使用指向app文件夹的符号链接,这将导致更多维护工作(例如,如果.libPaths
或inst/
的结构发生更改)。此外,您将无法轻松地将参数传递到应用的shiny-server
版本