将R Shiny应用程序保存为函数,并将参数传递给闪亮的应用程序

时间:2018-03-24 22:12:33

标签: r function shiny arguments global-variables

我正在构建一个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;作为应用程序本身的输入选项之一。我宁愿让用户不要担心它。但是,如果需要,知识渊博的用户可以在启动应用程序时控制它。

1 个答案:

答案 0 :(得分:0)

我目前使用shinyOptionsgetShinyOption将参数传递给闪亮的应用。

此外,我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关于此主题的意见。

编辑:为什么使用source而不是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方法,您需要使用指向app文件夹的符号链接,这将导致更多维护工作(例如,如果.libPathsinst/的结构发生更改)。此外,您将无法轻松地将参数传递到应用的shiny-server版本