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

时间:2017-03-24 15:05:36

标签: r shiny rstudio

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

如何将代码拆分为不同的文件,但仍保留“运行应用程序按钮”并在RStudio中重新启用“代码完成”?

如果没有!我能用Visual Studio整合闪亮吗?

2 个答案:

答案 0 :(得分:19)

是的,您可以通过与RStudio中的其他项目相同的方式轻松实现这一目标:通过使用提供的R机制来实现:

  • 在单独的文件中定义函数和/或对象。
  • 在主文件中使用source()加载其定义

闪亮函数的代码完成仅在使用library(shiny)加载闪亮包时在RStudio中发生。应用程序中的主文件将显示“运行应用程序”按钮。在下面的示例中,这将是 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 文件。

答案 1 :(得分:1)

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

如果您搜索此问题,可以找到this issue,然后按照该问题中的提交进行操作,您可以找到what's the rule to have a run app buttonthis function about isShinyAppDirthis function of shinyfiletype

基本上任何文件夹都有ui.Rserver.Rapp.Rglobal.Rwww文件夹将被视为闪亮文件夹(详细条件较为复杂) ,请参阅源代码),然后上面的4个文件将有run app按钮。

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