【问题标题】:Use dynamic dateRange to filter data and aggregate resulting dataframe by a dynamic selectInput使用动态 dateRange 过滤数据并通过动态 selectInput 聚合结果数据框
【发布时间】:2018-10-03 12:43:18
【问题描述】:

我正在基于以下示例数据框开发闪亮仪表板:

Date     Year Month Week Wday Day Time  ActiveEnergy
2/1/2009 2009 2     5    Sun  1    0    55.36111
3/1/2009 2009 3     9    Sun  1    0    9.334444
4/1/2007 2007 4     14   Sun  1    0    41.27667
6/1/2008 2008 6     22   Sun  1    0    32.89833
7/1/2007 2007 7     27   Sun  1    0    27.11667
8/1/2010 2010 8     31   Sun  1    0    4.871111

在 sidebarMenu 的子菜单“历史”下,我想显示用户选择的时间范围内消耗的 ActiveEnergy 的 barplot (ggplot)。这是通过在 sidebarMenu 中包含的日历(“dateRange”)中选择 dateRangeInput(开始和结束日期)来完成的。

反过来,我希望条形图的 x 轴 是由“选择时间间隔”选择输入动态选择的频率聚合的 选定时间范围 .

为此,我在服务器中创建了frequency 变量,它将选择的input$TimeInterval 转换为我想在“聚合”函数中使用的“by”变量(例如“Weekly”=“Wday” )。

但是,我无法将反应式 input$dateRangeinput$TimeInterval 和聚合函数组合在一起。

关于如何正确编写此级联过滤的任何想法?

以下是我的代码供您参考:

server <- function(input, output) {

  frequency <- observe({
    ifelse(input$TimeInterval=="Daily", "Hour",
           ifelse(input$TimeInterval=="Weekly", "Week",
                  ifelse(input$TimeInterval=="Monthly", "Month",
                         ifelse(input$TimeInterval=="Yearly", "Date"))))

  })

  filteredData <- reactive({
    data %>% filter(Date>=input$dateRange[1]  & Date<=input$dateRange[2])%>%
      select(frequency(), ActiveEnergy)
  })

  df<-reactive({
    freq<-paste(frequency())
    aggregate(filteredData(), filteredData()[[freq]] , FUN=mean, na.rm=TRUE)
  })

  output$plot1 <- renderPlot({
    ggplot(df(), aes(x=frequency(), y=ActiveEnergy)) +   geom_bar(stat = "identity", fill="steelblue")
  })
}

shinyApp(ui, server)

【问题讨论】:

  • 你应该提供一个可重复的例子..而不是aes(x=frequency()..,我认为应该是aes_string(x=frequency()...

标签: r shiny aggregate shinydashboard reactive


【解决方案1】:

您不能像响应式那样调用observer,它不是为此目的而设计的,因为它会产生副作用,而不是生成响应式数据集。所以你的频率应该是reactive,你可以在你的应用程序的其他地方调用它。

您也不需要 2 个反应器来生成过滤/聚合的数据,您可以合而为一,除非您在不同的过程中需要两个不同的数据集。

最后,正如@MLavoie 所说,您的aes 应该更改为aes_string,因为频率将是一个字符值,aes 无法正确解释。它只会显示 1 条。

把它们放在一起你会得到:

library(shiny)
library(ggplot2)
library(dplyr)

DateSeq = seq(as.Date("2012-1-1"), as.Date("2018-1-1"), "month")
data <- data.frame(
  ID = 1:length(DateSeq),
  Date = DateSeq,
  Month = sample(1:12, length(DateSeq), T),
  Week = sample(1:10, length(DateSeq), T),
  Wday = sample("Sun", length(DateSeq), T),
  Day = sample(1:10, length(DateSeq), T),
  ActiveEnergy = runif(length(DateSeq), min = 2, 7000)
)




ui <- fluidPage(
  selectInput("TimeInterval", label = "time", choices = c("Daily", "Weekly", "Monthly", "Yearly")),
  dateRangeInput("dateRange", "Date Select", format = "yyyy-mm-dd", start=min(DateSeq), end=max(DateSeq)),
  plotOutput("plot1")
)



server <- function(input, output) {

  frequency <- reactive({
    ifelse(input$TimeInterval=="Daily", "Day",
           ifelse(input$TimeInterval=="Weekly", "Week",
                  ifelse(input$TimeInterval=="Monthly", "Month",
                         ifelse(input$TimeInterval=="Yearly", "Date"))))
  })

  df <- reactive({
    data %>% 
      filter(Date >= input$dateRange[1]  & Date <= input$dateRange[2]) %>%
      group_by_(frequency()) %>%
      summarise(mean_active = mean(ActiveEnergy))
  })

  output$plot1 <- renderPlot({
    ggplot(data = df(), aes_string(x = frequency(), y = "mean_active", 
                                   group = factor(frequency()))) +
      geom_bar(aes_string(frequency(), "mean_active"), 
               stat = "identity", fill="steelblue")
  })
}

shinyApp(ui, server)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多