保存R Shiny应用程序作为一个传递给Shiny应用程序的参数的函数



我正在构建一个R包,该R包具有启动闪亮应用程序的功能。我希望该功能包括一个参数,要传递给应用程序。我发现工作的唯一方法是设置全局值,然后让应用程序使用该全局值:

launch_app <- function(MonteCarlo=1000){
  MonteCarlo_global <<- MonteCarlo
  shiny::runApp(appDir = system.file("app.R", package="my_package"))
}

是否有更好的方法可以在整个闪亮的应用程序中使用我的"蒙特卡洛"论点?请注意,我试图避免将"蒙特卡洛"作为应用本身中的输入选项之一。我宁愿让用户不用担心。但是,如果需要,知识渊博的用户可以在启动应用程序时控制它。

我当前使用 shinyOptionsgetShinyOption将参数传递到闪亮的应用程序。

另外,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方法,您需要使用指向应用程序文件夹的符号链接,这将导致更多的维护工作(例如,如果.libPathsinst/更改的结构(。另外,您将无法轻松地将参数传递给您的应用程序的shiny-server版本

相关内容

  • 没有找到相关文章

最新更新