使用Shiny应用程序创建响应式数据框架

6
我正在尝试让这个反应式返回一个数据框,以便我可以用Plotly进行操作。
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是我之前的同一个函数。现在我遇到了错误:没有活动的反应性上下文,不允许操作。我该如何使用observeEvent和reactiveValues来处理用户输入?


1
你是否以正确的方式调用了响应式?你需要使用 avghour() 调用它,而不是 avghour - Tom Stringham
是的,在plotly中引用它时,我使用的是avghour()$columnName。 - Dustin Knight
我的回答有帮到您吗? - Mike Wise
我看不到之前的 getHourlyAverage - Mike Wise
如果您只是使用更常规的x和y列名称,我认为它会起作用。我认为plotly不能接受字符串。 - Mike Wise
显示剩余5条评论
1个回答

10

我建议将数据框存储在所谓的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)

这里有一张屏幕截图,以帮助您形象化理解:

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接