使用dynamic dateRange通过dynamic selectInput筛选数据并聚合生成的数据帧
我正在基于以下示例数据帧开发ShinydaShashboard:使用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
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()…
)。