使一个反应对象内创建的对象可用于另一个闪亮的对象

时间:2013-10-19 13:49:24

标签: r output rstudio shiny

我有一个闪亮的应用程序,我在其中定义基于滑块的对象并从中创建data.frame。这用于创建一个图,我想在其下面包含一个汇总表。我的问题是必须在反应对象内部定义绘图以根据滑块进行更新,但我发现当我尝试访问对象以在不同的反应对象内打印摘要时,它没有找到。

我想两次运行相同的计算代码只是为了让对象进入另一个反应对象。我的两个初步想法:

  • 我尝试在第一个被动对象中使用save(object, file = "..."),然后将load(file = "...")放在第二个,但不会更新。
  • 我想过在我的反应plotOutput定义之外定义我的对象,但我很确定它会在用户输入改变时不会更新;它将保留初始input对象默认设置的值。

嗯,刚开始尝试后一种想法,它甚至没有那么远:

  • 我把它放在shinyServer(...)之前,但它无法生成数据,因为我的调用取决于input,并且此时不知道input
  • 我把它放在shinyServer(...)之后,但在renderPlot(...)之前尝试为所有输出对象制作一个“全局可用”对象,并责备我试图做一些使用{{1}的事情在反应函数之外。

这是一个例子来说明,修改自Shiny的"Hello Shiny!" example

ui.R

input

server.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("distPlot"),
    tableOutput("summary")
  )
))

如果按原样运行,library(shiny) # Define server logic required to generate and plot a random distribution shinyServer(function(input, output) { output$distPlot <- renderPlot({ # generate an rnorm distribution and plot it dist <- rnorm(input$obs) hist(dist) }) output$summary <- renderTable({ #dist <- rnorm(input$obs) summary <- table(data.frame(cut(dist, 10))) }) }) 将抛出错误,因为它不知道cut。如果您取消注释我们在dist中重新定义dist的行,那么它就会有用。

这是一个简单的代码 - 我的相关程度更高,我真的不想再运行两次,只是为了让另一个反应输出知道相同的结果。

建议?

1 个答案:

答案 0 :(得分:3)

为了根据other question I consider mine to have duplicated中的答案充实上面的示例,代码看起来像这样:

library(shiny)

# Define server logic required to generate and plot a random distribution
shinyServer(function(input, output) {

  dist <- reactive(rnorm(input$obs))

  output$distPlot <- renderPlot({

    # generate an rnorm distribution and plot it
    dist <- dist()
    hist(dist)
  })

  output$summary <- renderTable({
    dist <- dist()
    summary <- table(data.frame(cut(dist, 10)))
  })
})