web-dev-qa-db-fra.com

Existe-t-il des variables globales dans R Shiny?

Comment déclarez-vous des variables globales avec R Shiny afin de ne pas avoir à exécuter plusieurs fois les mêmes morceaux de code? Comme exemple très simple, j'ai 2 tracés qui utilisent les mêmes données exactes mais je veux seulement calculer les données UNE FOIS.

Voici le fichier i.R:

library(shiny)

# Define UI for application that plots random distributions 
shinyUI(pageWithSidebar(

# Application title
headerPanel("Hello Shiny!"),

# Sidebar with a slider input for number of observations
sidebarPanel(
sliderInput("obs", 
            "Number of observations:", 
            min = 1,
            max = 1000, 
            value = 500)
  ),

# Show a plot of the generated distribution
 mainPanel(
   plotOutput("distPlot1"),
  plotOutput("distPlot2")
 )
))

Voici le fichier server.R:

library(shiny)

shinyServer(function(input, output) {

  output$distPlot1 <- renderPlot({ 
    dist <- rnorm(input$obs)
    hist(dist)
  })

  output$distPlot2 <- renderPlot({ 
    dist <- rnorm(input$obs)
    plot(dist)
  })

})

Notez que output$distPlot1 Et output$distPlot2 Font tous deux dist <- rnorm(input$obs) qui réexécute deux fois le même code. Comment faire exécuter le vecteur "dist" une fois et le rendre disponible pour toutes les fonctions de rendu? J'ai essayé de mettre la dist en dehors des fonctions comme:

library(shiny)

shinyServer(function(input, output) {

  dist <- rnorm(input$obs)

  output$distPlot1 <- renderPlot({ 
    hist(dist)
  })

  output$distPlot2 <- renderPlot({ 
    plot(dist)
  })

})

Mais j'obtiens une erreur disant que l'objet "dist" n'est pas trouvé. Ceci est un exemple de jouet dans mon vrai code J'ai 50 lignes de code que je colle dans plusieurs fonctions "Render ...". De l'aide?

Oh oui si vous voulez exécuter ce code, créez simplement un fichier et exécutez ceci: library (shiny) getwd () runApp ("C:/Desktop/R Projects/testShiny")

où "testShiny" est le nom de mon projet de studio R.

37
user3022875

Cette page sur la page Web Shiny explique la portée des variables Shiny.

Les variables globales peuvent être mises dans server.R (selon la réponse de Ricardo) ou dans global.R.

Les objets définis dans global.R sont similaires à ceux définis dans server.R en dehors de shinyServer (), avec une différence importante: ils sont également visibles pour le code dans ui.R. En effet, ils sont chargés dans l'environnement global de la session R; tout le code R dans une application Shiny est exécuté dans l'environnement global ou un enfant de celui-ci.

En pratique, il n’existe pas souvent de partage de variables entre server.R et ui.R. Le code dans ui.R est exécuté une fois, lorsque l'application Shiny est lancée et génère un fichier HTML qui est mis en cache et envoyé à chaque navigateur Web qui se connecte. Cela peut être utile pour définir certaines options de configuration partagées.

23
nico

Comme mentionné dans le lien que @nico répertorie ci-dessus, vous pouvez également utiliser le classificateur << - dans vos fonctions pour rendre les variables accessibles en dehors de la fonction.

foo <<- runif(10)

au lieu de

foo <- runif(10)

Le lien indique "Si les objets changent, alors les objets modifiés seront visibles dans chaque session utilisateur. Mais notez que vous devrez utiliser l'opérateur << - d'affectation pour modifier bigDataSet, car l'opérateur <- affecte uniquement des valeurs dans le local environnement."

Je l'ai utilisé à différents niveaux de succès en brillant. Comme toujours, soyez prudent avec les variables globales.

10
Jim Crozier