如何在 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
)
此代码除了启动对象 myUI
和 myserver
并调用应用程序外什么都不做。
文件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.R
、server.R
、app.R
、global.R
、www
的文件夹都会被认为是闪亮文件夹(具体情况为更复杂,见源代码),那么上面的 4 个文件将有 run app
按钮。
我注意到的一件事是,通常您可以保留应用程序 运行,进行一些更改,然后 reload app
以查看更改,但如果您获取其他文件,reload app
按钮不会重新加载源文件中的更改。
我试图将 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
)
此代码除了启动对象 myUI
和 myserver
并调用应用程序外什么都不做。
文件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.R
、server.R
、app.R
、global.R
、www
的文件夹都会被认为是闪亮文件夹(具体情况为更复杂,见源代码),那么上面的 4 个文件将有 run app
按钮。
我注意到的一件事是,通常您可以保留应用程序 运行,进行一些更改,然后 reload app
以查看更改,但如果您获取其他文件,reload app
按钮不会重新加载源文件中的更改。