Murray
Murray

Reputation: 729

Create and reuse data within R Shiny server

I'd like to create data once and reuse it in multiple plots. The example below creates the data in each plot, but how can I create it once (x) and have each plot use x?

ui <- shinyUI(
        fluidPage(
                sidebarLayout(
                        sidebarPanel(
                                numericInput(inputId = "mean", label = "Mean", value = 50)
                        ),
                        mainPanel(
                                column(6,plotOutput(outputId = "hist1")
                                ),
                                column(6,plotOutput(outputId = "hist2")
                                )
                        )
                )
        )
)


server <- function(input,output){

        # I'd like to create the data just once here, and then reuse it in each plot
        # x <- rnorm(100,input$mean,5) 

        output$hist1 <- renderPlot({
                hist(rnorm(100,input$mean,5))
                #hist(x)
        })
        output$hist2 <- renderPlot({
                hist(rnorm(100,input$mean,5))
                #hist(x)
        })
}

runApp(list(ui = ui, server = server))

Upvotes: 3

Views: 1085

Answers (2)

Weihuang Wong
Weihuang Wong

Reputation: 13128

You can wrap your rnorm in a reactive expression to create a reactive conductor. Then, use the conductor in your endpoints (output$). See http://shiny.rstudio.com/articles/reactivity-overview.html.

server <- function(input,output){

        # I'd like to create the data just once here, and then reuse it in each plot
        x <- reactive(rnorm(100, input$mean, 5))

        output$hist1 <- renderPlot({
                hist(x())
        })
        output$hist2 <- renderPlot({
                hist(x())
        })
}

Upvotes: 1

Chris
Chris

Reputation: 29742

Wrapping the server codes with observe would do the job.

server <- function(input,output){

  # I'd like to create the data just once here, and then reuse it in each plot
          observe({
            data <- rnorm(100,input$mean,5)

            output$hist1 <- renderPlot({
            hist(data)
            #hist(rnorm(100,x,5))
            })

            output$hist2 <- renderPlot({
            hist(data)
            #hist(rnorm(100,x,5))
            })

         })

}

Upvotes: 1

Related Questions