如何在 RStudio 中将 Shiny 应用程序代码拆分为多个文件?

How to split Shiny app code over multiple files in RStudio?

我试图将 shiny 应用程序的代码拆分到不同的文件中,但无法让它在 Shiny 中正常工作。我的尝试可以找到in this demo

如何将我的代码拆分到不同的文件中,但仍然保留 'Run App button ' 并让 'Code Completion' 回到 RStudio?

如果没有!我可以将闪亮与 Visual Studio 集成吗?

是的,您可以像对待 RStudio 中的所有其他项目一样非常轻松地实现这一点:通过使用提供的 R 机制来实现:

  • 在单独的文件中定义函数 and/or 个对象。
  • 在主文件中使用 source() 来加载它们的定义

闪亮函数的代码完成仅在使用 library(shiny) 加载闪亮包时才会在 RStudio 中发生。 'Run App' 按钮将在应用程序的主文件中可见。在下面的示例中,这将是 app.R 文件。因此,如果您想从 RStudio 中 运行 您的应用程序,您总是必须返回到主文件。

标准示例

一个例子:

在文件 app.R 中,您输入:

library(shiny)
source('myUI.R', local = TRUE)
source('myServer.R')


shinyApp(
  ui = myUI,
  server = myserver
)

此代码除了启动对象 myUImyserver 并调用应用程序外什么都不做。

文件myUI.R包含

source('Tabs.R')
myUI <- shinyUI({
  fluidPage(
    tabsetPanel(
      Tab1,
      Tab2
    )
  )
})

此文件定义 app.R 中使用的 UI 对象。函数 tabsetPanel 将多个 tabPanel 作为参数。这些 tabPanel 在以下文件 (Tabs.R) 中创建,因此必须在 UI 构建之前获取其中一个。

文件Tabs.R包含:

Tab1 <- tabPanel("First Tab",
                 selectInput("select",
                             "Choose one",
                             choices = letters[1:3],
                             selected = 'a'))

Tab2 <- tabPanel("Second Tab",
                 textOutput('mychoice'))

此文件创建要添加到 tabsetPanel 的 tabPanel 对象。在我自己的代码中,我将每个 tabPanel 定义存储在一个单独的文件中。

文件myServer.R包含:

myserver <- function(input,output,session){
  output$mychoice <- renderText(
    input$select
  )
}

如果需要,您可以再次创建单独的文件,其中包含可在服务器函数内使用的函数。但是您始终必须遵循经典的 R 逻辑:将事物分配给对象并在要插入它的位置引用该对象。

您也可以直接在 server() 函数中获取源代码。在这种情况下,您应该使用 source(..., local = TRUE) 在本地获取源,因此创建的对象包含在 server 函数中。另见:https://shiny.rstudio.com/articles/scoping.html

使用模块

如果你想更上一层楼并重用特定的逻辑和布局(例如,应该附加到某些地块的地块选项控制面板),你应该去模块。 (另见 http://shiny.rstudio.com/articles/modules.html

模块可以再次存储在单独的文件中,该文件来源于您拥有的 app.R 文件。

@Joris Meys 的回答涵盖了将闪亮代码拆分为文件的主题。虽然问题的一部分是使用 run app 按钮,但即使组织制作了有效的闪亮应用程序,该按钮也可能不可用。

如果你搜索这个问题你可以找到 this issue, then following to the commit made in that issue you can find what's the rule to have a run app button, and this function about isShinyAppDir, this function of shinyfiletype:

基本上任何有ui.Rserver.Rapp.Rglobal.Rwww的文件夹都会被认为是闪亮文件夹(具体情况为更复杂,见源代码),那么上面的 4 个文件将有 run app 按钮。

我注意到的一件事是,通常您可以保留应用程序 运行,进行一些更改,然后 reload app 以查看更改,但如果您获取其他文件,reload app 按钮不会重新加载源文件中的更改。