Pregunta ¿Hay variables globales en R Shiny?


¿Cómo declaras las variables globales con R Shiny para que no necesites ejecutar las mismas piezas de código varias veces? Como ejemplo muy simple, tengo 2 gráficos que usan los mismos datos exactos, pero solo quiero calcular los datos UNA VEZ.

Aquí está el ui.R archivo:

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

Aquí está el servidor.R archivo:

library(shiny)

shinyServer(function(input, output) {

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

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

})

Note que ambos output$distPlot1 y output$distPlot2  hacer dist <- rnorm(input$obs) que vuelve a ejecutar el mismo código dos veces. ¿Cómo se hace que el vector "dist" se ejecute una vez y esté disponible para todas las funciones de renderplot? He tratado de poner el dist fuera de las funciones como:

library(shiny)

shinyServer(function(input, output) {

  dist <- rnorm(input$obs)

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

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

})

Pero recibo un error que dice que el objeto "dist" no se encuentra. Este es un ejemplo de juguete en mi código real. Tengo 50 líneas de código que estoy pegando en múltiples funciones "Renderizar ...". ¿Alguna ayuda?

Oh sí, si quieres ejecutar este código simplemente crea un archivo y ejecuta esto:     biblioteca (brillante)     getwd ()     runApp ("C: / Desktop / R Projects / testShiny")

donde "testShiny" es el nombre de mi proyecto de estudio R.


30
2017-12-02 16:45


origen


Respuestas:


Esta página en el Brillante página web explica el alcance de las variables Brillantes.

Las variables globales se pueden poner en server.R (según la respuesta de Ricardo) o en global.R.

Los objetos definidos en global.R son similares a los definidos en server.R outside shinyServer (), con una diferencia importante: también son visibles para el código en ui.R. Esto se debe a que se cargan en el entorno global de la sesión R; todo el código R en una aplicación brillante se ejecuta en el entorno global o es secundario.

En la práctica, no hay muchas ocasiones en las que sea necesario compartir variables entre server.R y ui.R. El código en ui.R se ejecuta una vez, cuando se inicia la aplicación Shiny y genera un archivo HTML que se almacena en caché y se envía a cada navegador web que se conecta. Esto puede ser útil para establecer algunas opciones de configuración compartidas.


18
2017-12-02 17:19



Como se menciona en el enlace que @nico enumera arriba, también puede usar el clasificador << - dentro de sus funciones para hacer que las variables sean accesibles fuera de la función.

foo <<- runif(10)

en lugar de

foo <- runif(10)

El enlace dice "Si los objetos cambian, los objetos cambiados serán visibles en cada sesión de usuario. Pero tenga en cuenta que necesitará usar el operador de asignación << - para cambiar el BigDataSet, porque el operador <- solo asigna valores en el local ambiente."

Lo he usado para diferentes niveles de éxito en brillante. Como siempre, tenga cuidado con las variables globales.


6
2017-12-02 17:53