在R Shiny服务器中创建和重用数据

时间:2016-11-23 06:02:32

标签: r shiny

我想创建一次数据并在多个图中重复使用它。下面的示例在每个图中创建数据,但是如何创建一次(x)并使每个图使用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))

2 个答案:

答案 0 :(得分:1)

使用observe包装服务器代码可以完成这项工作。

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

         })

}

答案 1 :(得分:1)

您可以将rnorm包裹在反应式表达式中以创建反应式导体。然后,在端点(output$)中使用导体。请参阅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())
        })
}