3

我目前正在创建一个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在通常的应用程序中)。shinyAppor中似乎没有合适的参数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函数的包时会收到警告。出现这些警告是因为该包随后破坏了建议的包开发范围模型。

4

1 回答 1

-1

在 中的帮助文档中shiny::runApp,它说appDir可能是以下任何一种:

包含 server.R 的目录,以及包含文件 index.html 的 ui.R 或 www 目录。

包含 app.R 的目录。

包含 Shiny 应用程序的 .R 文件,以生成 Shiny 应用程序对象的表达式结尾。

包含 ui 和服务器组件的列表。

由 shinyApp 创建的 Shiny 应用程序对象。

当你运行 viaRunApp("~/myApp")时,它是一个包含 app.R 的目录, 如果你想通过 shinyApp 创建的闪亮应用对象运行

你可以尝试像

myapp_obj <- shinyApp(
  fluidPage(tags$img(src = "image.gif")),
  server <- function(...){}
)
runApp(myapp_obj)

更新
创建脚本myapp_script.R

shinyApp(
  fluidPage(tags$img(src='image.gif')),
  server <- function(...){}
)

然后打电话runApp("myapp_script.R")

于 2017-10-02T01:27:52.697 回答