【问题标题】:Creating a reactive dataframe with shiny apps使用闪亮的应用程序创建反应式数据框
【发布时间】:2017-04-04 20:32:52
【问题描述】:

我试图让这个反应返回一个我可以用情节操作的数据框。

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?

【问题讨论】:

  • 您是否以正确的方式调用响应式?您需要使用avghour() 调用它,而不是avghour。
  • 是的,当我在情节中引用它时,我使用的是 avghour()$columnName。
  • 我的回答有帮助吗?
  • 会看看...乍一看还不错。 getHourlyAverage 长什么样子。
  • 我看不到getHourlyAverage“和以前一样”。

标签: r dataframe shiny reactive-programming plotly


【解决方案1】:

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

这里有一个屏幕截图,可以帮助您形象化:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 2019-12-05
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2015-05-13
    • 2019-12-11
    相关资源
    最近更新 更多