我目前正在创建一个shiny::shinyApp
通过包装函数调用的闪亮应用程序。
startApp <- function(param1, param2, ...){
# in fact, ui and server change based on the parameters
ui <- fluidPage()
server <- function(...){}
runApp(shinyApp(ui, server))
}
当我包含资源(如图像、视频等)时,我当前使用该addResourcePath
命令并包含带有前缀的资源。但是,我想添加一个“默认资源路径”(appDir/www
在通常的应用程序中)。shinyApp
or中似乎没有合适的参数runApp
。将工作目录设置为资源文件夹或上一级也不起作用。
这是一个简短的 MWE。
## ~/myApp/app.R
library(shiny)
shinyApp(
fluidPage(tags$img(src = "image.gif")),
server <- function(...){}
)
## ~/myApp/www/image.gif
# binary file
如果我通过RunApp("~/myApp")
一切正常运行应用程序,但是
setwd("~/myApp")
myApp <- shinyApp(source("app.R")$value)
runApp(myApp)
将无法显示图像。任何建议表示赞赏。
语境
我想基于shiny.appobj
(代表应用程序的对象)而不是文件路径来启动应用程序的原因是,后一种方法在将参数传递给应用程序时效果不佳。这是关于这个主题的讨论。
将参数传递给被调用的应用程序的推荐方法runApp("some/path")
如下:
startApp <- function(param1, param2, ...) {
.GlobalEnv$.param1 <- param1
.GlobalEnv$.param2 <- param2
.GlobalEnv$.ellipsis <- as.list(...)
on.exit(rm(.param1, .param2, .ellipsis, envir = .GlobalEnv))
runApp("~/myApp")
}
这种方法只是丑陋的 IMO,当我构建包含应用程序和startApp
函数的包时会收到警告。出现这些警告是因为该包随后破坏了建议的包开发范围模型。