使用反应变量使用Shiny更改数据子集

时间:2015-06-10 17:09:22

标签: r shiny

我有一个跨越数年的数据集。我的闪亮应用程序旨在让用户一次一个步骤,进行一些分析并使用该周的新信息更新数据集。例如时间表。

在普通的R中,我执行以下代码,其中up​​date_schedule是一个自定义函数:

data[indx:(indx+7)] <- update_data(data[indx:(indx+7)], schedule)

使用闪亮,我试图做类似的事情,但得到错误:

.getReactiveEnvironment()$ currentContext()中的错误:   没有活动的反应上下文,不允许操作。 (你试图做一些只能在反应式表达式或观察者内部完成的事情。)

#ui
shinyUI(pageWithSidebar(
  sidebarPanel(
  actionButton("nextButton", "Process Next Week")
  ),

  mainPanel(
    textOutput('week'),
    plotOutput('myplot')
  )
))


#server
data <<- data.frame(value = rep(1:4, 3:6), open = rep(c(1,1,0), 6))

shinyServer(function(input, output) ({

  week <- reactive({as.numeric(input$nextButton)+1})
  output$week <- renderText({week()})

  #this is the problem line
  data[(week()*7):((week()+1)*7)]$open <<- rep(1,7)

  #but here the sub-setting works for plotting
  output$myplot <- renderPlot({
      p1 <- plot(data$value[(week()*7):((week()+1)*7)], 
       col = as.factor(data$open)[(week()*7):((week()+1)*7)])
      return(p1)
     })

  })
)

有没有办法使用week()值来选择要更新的数据部分?此外,实际上我试图一次更新几个变量,而不仅仅是本例中的“打开”列。

我尝试了以下操作以将我的反应变量保留在被动语句中,但是出现了错误:

data <<- reactive({data %>%
  mutate(open = replace(open, (week()*7):((week()+1)*7, rep(1,7))})

Error in plot(data()$value[(week() * 7):((week() + 1) * 7)], col = as.factor(data()$open)[(week() *  : 
error in evaluating the argument 'x' in selecting a method for function 'plot': Error in UseMethod("mutate_") : 
no applicable method for 'mutate_' applied to an object of class "reactive"

1 个答案:

答案 0 :(得分:0)

您是否已阅读并完全理解闪亮教程的反应式表达式章节? http://shiny.rstudio.com/tutorial/lesson6/

任何使用反应式表达式(week的表达式都是被动的,因为您使用reactive({})定义它必须在反应式上下文中使用,例如另一个reactive()调用或observe内部renderXXX 1}}或reactiveValues()。您还应该查看fputs()函数