web-dev-qa-db-fra.com

Comment diviser le code d'application Shiny sur plusieurs fichiers dans RStudio?

J'ai essayé de diviser le code d'une application brillante sur différents fichiers, mais je n'arrive pas à faire fonctionner cela correctement dans Shiny. Ma tentative peut être trouvée dans cette démo

Comment puis-je diviser mon code sur différents fichiers, tout en conservant le "bouton Exécuter l'application" et avoir "Code Completion" de retour dans RStudio?

si non ! puis-je intégrer shiny à Visual Studio?

13
Magdy

Oui, vous pouvez réaliser cela très facilement de la même manière que vous le faites avec tous les autres projets dans RStudio: en utilisant les mécanismes R fournis pour y parvenir:

  • définir des fonctions et/ou des objets dans des fichiers séparés.
  • utilisez source () dans votre fichier principal pour charger leurs définitions

L'achèvement du code pour les fonctions brillantes se produit uniquement dans RStudio lorsque le paquet brillant est chargé à l'aide de library(shiny). Le bouton "Exécuter l'application" sera visible pour le fichier principal de l'application. Dans l'exemple ci-dessous, ce serait le fichier app.R . Donc, si vous souhaitez exécuter votre application à partir de RStudio, vous devez toujours revenir au fichier principal.

exemple standard

Un exemple :

Dans un fichier app.R vous mettez:

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


shinyApp(
  ui = myUI,
  server = myserver
)

Ce code ne fait rien d'autre qu'initier les objets myUI et myserver et appeler l'application.

Le fichier myUI.R contient

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

Ce fichier définit l'objet UI utilisé dans app.R. La fonction tabsetPanel prend un certain nombre de tabPanels comme arguments. Ces tabPanels sont créés dans le fichier suivant (Tabs.R), de sorte qu'il faut en trouver un avant de construire le UI.

Le fichier Tabs.R contient:

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

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

Ce fichier crée les objets tabPanel à ajouter au tabsetPanel. Dans mon propre code, je stocke chaque définition de tabPanel dans un fichier séparé.

Le fichier myServer.R contient:

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

Et si vous le souhaitez, vous pouvez à nouveau créer des fichiers séparés avec des fonctions qui peuvent être utilisées à l'intérieur de la fonction serveur. Mais vous devez toujours suivre la logique R classique: attribuer des choses à un objet et faire référence à cet objet à la position où vous souhaitez l'insérer.

Vous pouvez également créer du code source directement à l'intérieur de la fonction server(). Dans ce cas, vous devez source localement en utilisant source(..., local = TRUE), de sorte que les objets créés sont contenus dans la fonction server. Voir aussi: https://shiny.rstudio.com/articles/scoping.html

Utiliser des modules

Si vous voulez prendre un cran et réutiliser une certaine logique et mise en page (par exemple, un panneau de contrôle d'options de tracé qui devrait être attaché à certains tracés), vous devez aller aux modules. (voir aussi http://shiny.rstudio.com/articles/modules.html )

Les modules peuvent à nouveau être stockés dans un fichier séparé, et ce fichier provenant du fichier app.R que vous avez.

21
Joris Meys

La réponse de @Joris Meys a couvert le sujet de la division du code brillant en fichiers. Bien qu'une partie de la question consiste à utiliser le bouton run app, Qui peut ne pas être disponible même si l'organisation crée une application brillante valide.

Si vous recherchez cette question, vous pouvez trouver ce problème , puis en suivant le commit effectué dans ce problème, vous pouvez trouver quelle est la règle pour avoir un bouton run app , et cette fonction sur isShinyAppDir , cette fonction de shinyfiletype :

Fondamentalement, tout dossier possède un dossier ui.R, server.R, app.R, global.R, www sera considéré comme un dossier brillant (les conditions détaillées sont plus complexe, voir le code source), alors les 4 fichiers ci-dessus auront le bouton run app.

Une chose que j'ai remarquée est qu'en général vous pouvez continuer à faire fonctionner l'application, faire quelques changements puis reload app Pour voir les changements, mais si vous avez trouvé un autre fichier, le bouton reload app Ne rechargera pas les changements dans ce sourced fichier.

1
dracodoc