我试图让这个被动反应来返回一个我可以用剧情操纵的数据框。
avghour <- reactive({
result <- data.frame()
start_date <- as.numeric(unlist(input$i6[1]))
end_date <- as.numeric(unlist(input$i6[2]))
mkw <- maxkwpeakdates[(maxkwpeakdates >= start_date & maxkwpeakdates <=
end_date) & !is.na(maxkwpeakdates), ]
mkw <- na.omit(mkw)
mopkw <- maxonpeakkwdates[(maxonpeakkwdates >= x &
maxonpeakkwdates <= y) & !is.na(maxonpeakkwdates),
]
mopkw <- na.omit(mopkw)
mkwhour <- data.frame(as.data.frame(apply(mkw, 2, hour)))
mopkwhour <- as.data.frame(apply(mopkw, 2, hour))
mkwhour <- as.data.frame(sapply(mkwhour, tabulate, 24))
mopkwhour <- as.data.frame(sapply(mopkwhour, tabulate, 24))
mkwhour <- as.data.frame(apply(mkwhour, 1, mean))
mopkwhour <- as.data.frame(apply(mopkwhour, 1, mean))
result <- data.frame(mkwhour, mopkwhour)
colnames(result) <- c("1", "2")
return(result)
})
我希望能够绘制结果数据框。当我调试我的应用程序时,结果发现avghour被保存为一个函数而不是数据框。无功要求的值是强制反应正常更新但我不能将结果保存为数据帧。我是否正确使用反应?我需要以另一种方式做这件事吗?
更新
I have changed my server code to be like this:
server <- function(input, output) {
averages <- reactiveValues(hourly = avghour(input$'i6'[1], input$'i6'[2]))
observeEvent(input$submit,{
averages$hourly <- avghour(input$'i6'[1], input$'i6'[2])
})
output$"1" <- renderPlotly({
plot_ly() %>%
add_trace(type = 'bar',
data=averages$hourly,
x=~'1',
y=~'2')
})
}
getHourlyAverage与我之前的功能相同。现在我得到error: operation not allowed without an active reactive context.
如何将observeEvent和reactiveValues与用户输入一起使用?
答案 0 :(得分:6)
我建议将数据帧存储在所谓的reactiveValues
列表中。然后它们具有与使用reactive
函数计算的事物相同的反应属性(因为在原始变化时将触发依赖于它们的其他反应性),但是您可以获取它们的所有元素来操纵它们。
一般情况下,建议只使用反应函数可以逃脱的简单程序应该这样做,但我发现当事情变得更复杂时,经常会导致死胡同,因为没有合理的存储位置和更新您的数据。
请注意reactiveValues
是一个列表,您可以在其中存储多个内容,从而将相关内容保持在一起。该名单的所有成员都将被动反应。
这是一个非常简单的使用plotly的例子:
library(plotly)
library(shiny)
ui <- shinyUI(fluidPage(
plotlyOutput("myPlot"),
actionButton("regen","Generate New Points")
))
server <- shinyServer(function(input, output) {
n <- 100
rv <- reactiveValues(m=data.frame(x=rnorm(n),y=rnorm(n)))
observeEvent(input$regen,{
rv$m <- data.frame(x=rnorm(n),y=rnorm(n))
})
output$myPlot <- renderPlotly({
plot_ly() %>% add_markers(data=rv$m,x=~x,y=~y )
})
})
shinyApp(ui, server)
这是一个帮助可视化的屏幕截图: