【问题标题】:shiny app with module as a package以模块为包的闪亮应用程序
【发布时间】:2017-12-11 17:27:44
【问题描述】:

我正在尝试创建一个用模块组织的闪亮应用程序包。我找不到任何帮助,我能找到的每个示例都不使用模块。谁能给我一个例子?

【问题讨论】:

标签: r shiny


【解决方案1】:

Gregor de Cilia 为您提供了一个很好的示例,说明如何构建和导出 UI 和服务器功能。在包完全发挥作用之前需要考虑的其他一些事项:

  • 正如 Gregor 所说,导出这些函数将使最终用户可以使用它们。
  • 确保将shiny 包添加到描述文件的依赖列表中(另请参见Package Dependencies in the R manual)。与导入 shiny 包相比,将其添加到依赖列表中更有意义,因为最终用户也应该可以使用所有闪亮的功能,而不仅仅是您的模块功能。现在的标准是使用 import 而不是depends,但在这种情况下,Depends 更有意义。

为了使您的软件包一流,请添加一个小示例来说明您的模块。以 Gregor 为例,然后在你的包中添加一个文件夹 inst/examples/moduleExample/,其中有一个文件 app.R,如下所示:

shinyApp(
  fluidPage(myModuleUI("someId")),
  function(input,output,session){
    callModule(myModuleServer, "someId")
  }
)

现在您添加一个 moduleDemo 函数来说明模块的使用。

#' @export
moduleDemo <- function(){
  loc <- system.file("examples","moduleExample",
                     package = "myPackage")
  shinyAppDir(loc)
}

【讨论】:

  • 也许使用路径examples/moduleExample/app.R(和shinyAppDir)作为示例会更好。原因是this PR
  • @GregordeCillia 确实如此,相应地进行了调整并感谢您的提示。
【解决方案2】:

您必须确保将模块的 ui 部分和 server 部分导出到您的包中

#' @export
myModuleUI <- function(id){
  ns = NS(id)
  plotOutput(ns("plot"))
}

#' @export
myModuleServer <- function(input, output, session){
  output$plot <- renderPlot({hist(rnorm(100))})
}

从加载你的包的脚本中你可以使用

library(myPackage)

shinyApp(
  fluidPage(myModuleUI("someId")),
  function(input,output,session){
    callModule(myModuleServer, "someId")
  }
)

在记录模块时,没有标准的方法。大多数包都使用最小的类似函数的文档以及示例应用程序——请参阅 Joris Meys 的回答。

【讨论】:

  • 不要写那个方便的包装器,你会陷入各种环境问题。
  • 我目前在我的包中使用类似的模式,到目前为止一切正常。您能否详细说明这会如何造成麻烦?
  • 我在我的包中使用了类似的模式,但是当使用嵌套模块时,它有时会弄乱 id 链接。所以我删除了它。我必须补充一点,我使用构造函数创建基于不同模块的具有相似布局的应用程序,并允许用户使用字符串指定他们想要的模块。所以我的生活有点复杂,这就是问题开始的时候。
  • 感谢分享这些见解。到目前为止我还没有接触过嵌套模块,但如果我这样做了,这可能会为我节省很多时间。我编辑了我的答案以删除便利包装。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2013-07-08
  • 2017-09-30
相关资源
最近更新 更多