wake-up-neo.com

Gibt es globale Variablen in R Shiny?

Wie deklarieren Sie globale Variablen in R Shiny, damit Sie nicht dieselben Codeteile mehrmals ausführen müssen? Als sehr einfaches Beispiel habe ich 2 Diagramme, die dieselben exakten Daten verwenden, aber ich möchte die Daten nur EINMAL berechnen.

Hier ist die i.R Datei:

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")
 )
))

Hier ist die server.R Datei:

library(shiny)

shinyServer(function(input, output) {

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

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

})

Beachten Sie, dass sowohl output$distPlot1 Als auch output$distPlot2dist <- rnorm(input$obs) ausführen, wobei derselbe Code zweimal ausgeführt wird. Wie lässt man den "dist" -Vektor einmal laufen und stellt ihn allen Renderplot-Funktionen zur Verfügung? Ich habe versucht, das dist außerhalb der Funktionen wie zu setzen:

library(shiny)

shinyServer(function(input, output) {

  dist <- rnorm(input$obs)

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

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

})

Ich erhalte jedoch die Fehlermeldung, dass das Objekt "dist" nicht gefunden wurde. Dies ist ein Spielzeugbeispiel in meinem realen Code. Ich habe 50 Codezeilen, die ich in mehrere "Render ..." - Funktionen einfüge. Irgendeine Hilfe?

Oh ja, wenn Sie diesen Code ausführen möchten, erstellen Sie einfach eine Datei und führen Sie Folgendes aus: library (shiny) getwd () runApp ("C:/Desktop/R Projects/testShiny")

wobei "testShiny" der Name meines R-Studio-Projekts ist.

37
user3022875

Diese Seite auf der Shiny-Webseite erklärt das Scoping von Shiny-Variablen.

Globale Variablen können entweder in server.R (gemäß Ricardos Antwort) oder in global.R.

Objekte, die in global.R definiert sind, ähneln denen, die in server.R außerhalb von shinyServer () definiert sind, mit einem wichtigen Unterschied: Sie sind auch für den Code in ui.R sichtbar. Dies liegt daran, dass sie in die globale Umgebung der R-Sitzung geladen werden. Der gesamte R-Code in einer Shiny-App wird in der globalen Umgebung oder in einer untergeordneten Umgebung ausgeführt.

In der Praxis ist es nicht oft erforderlich, Variablen zwischen server.R und ui.R gemeinsam zu nutzen. Der Code in ui.R wird einmal ausgeführt, wenn die Shiny-App gestartet wird, und generiert eine HTML-Datei, die zwischengespeichert und an jeden Webbrowser gesendet wird, der eine Verbindung herstellt. Dies kann nützlich sein, um einige gemeinsam genutzte Konfigurationsoptionen festzulegen.

23
nico

Wie in dem Link erwähnt, den @nico oben auflistet, können Sie auch den << - Klassifikator in Ihren Funktionen verwenden, um Variablen außerhalb der Funktion zugänglich zu machen.

foo <<- runif(10)

anstatt von

foo <- runif(10)

Der Link lautet "Wenn sich die Objekte ändern, werden die geänderten Objekte in jeder Benutzersitzung angezeigt. Beachten Sie jedoch, dass Sie zum Ändern von bigDataSet den << - Zuweisungsoperator verwenden müssten, da der <- Operator nur Werte im lokalen Bereich zuweist Umgebung."

Ich habe dies verwendet, um unterschiedliche Erfolgsniveaus in glänzend. Seien Sie wie immer vorsichtig mit globalen Variablen.

10
Jim Crozier