使用dynamic dateRange通过dynamic selectInput筛选数据并聚合生成的数据帧

使用dynamic dateRange通过dynamic selectInput筛选数据并聚合生成的数据帧,r,shiny,aggregate,shinydashboard,reactive,R,Shiny,Aggregate,Shinydashboard,Reactive,我正在基于以下示例数据帧开发ShinydaShashboard: 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

我正在基于以下示例数据帧开发ShinydaShashboard:

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
在侧边栏菜单的子菜单“历史”下,我想显示用户选择的时间范围内消耗的有功能量的条形图。这是通过在侧边栏菜单中包含的日历(“日期范围”)中选择日期范围输入(开始和结束日期)来完成的

反过来,我希望条形图的x轴所选时间范围,由从“选择时间间隔”selectinput动态选择的频率聚合而成

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

但是,我无法将反应式
input$dateRange
input$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)

服务器您不能像调用反应式数据集那样调用
观察者,它不是为这个目的设计的,因为它会产生副作用,而不是生成反应式数据集。因此,你的频率应该是
被动的
,你可以在应用程序的其他地方调用

您也不需要两个reactive来生成过滤/聚合数据,您可以在一个过程中完成这一切,除非您在不同的过程中需要两个不同的数据集

最后,正如@MLavoie已经说过的,您的
aes
应该更改为
aes\u 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)
库(闪亮)
图书馆(GG2)
图书馆(dplyr)
DateSeq=序号(截止日期(“2012-1-1”)、截止日期(“2018-1-1”)、“月份”)

数据您应该提供一个可复制的示例..而不是
aes(x=frequency()…
我认为应该是
aes\u字符串(x=frequency()…
)。