Shiny - R框架>如何使用输入开关有条件地分组

时间:2016-08-17 00:38:24

标签: r shiny dplyr

在闪亮的谷歌群上问过这个问题,我还没有帮助:我正在努力将输入切换传递给dplyr的group_by_,在下面的代码中。

我将相关代码的两部分加在下面的不那么MRE中(即第9:11和24行)。

有效地,如果用户在UI中选择“每日”,则生成的分组应为group_by(第24行中的year = year(my_date),month = month(my_date),day = day(my_date),或者删除ANY分组数据已经是每天。

选择“每月”,应该产生group_by(年=年(my_date),月=月(my_date))

“annual”,应该产生group_by(年=年(my_date))

我欢迎关于我的代码/结构如何组织的元建议/批评。

谢谢

library(shiny)
library(dplyr)
library(lubridate)

ui <- fluidPage(
  dateInput("start", label = "start date", value = "2010-01-01"),
  dateInput("end", label = "end date", value = "2020-01-01"),
  selectInput("grouping_freq", label = "Granularity", 
              choices = list("daily" = 1,"monthly" = 2, "Yearly" = 3), 
              selected = 2), 
  tableOutput("my_table")
)

server <- function(input, output) {  

  df <- reactive({ data_frame(my_date = seq(input$start, input$end, by = 'day')) }) ## 10 years of daily data

  df2 <- reactive({ df() %>% mutate(dummy_data = cumsum(rnorm( nrow( df() ) ))) })

  output$my_table <- renderTable({
    df2() %>% group_by(year = year(my_date), month = month(my_date)) %>% 
      summarise(dummy_data = sum(dummy_data), my_date = as.Date(min(my_date)))
  })
}


shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:1)

您可以使用selectInput中选择的值来创建传递到group_by_的公式列表,dplyr::group_by是使用标准评估的group_list <- switch(input$grouping_freq, list(yr=~year(my_date), mn=~month(my_date), dy=~day(my_date)), list(yr=~year(my_date), mn=~month(my_date)) list(yr=~year(my_date))) 版本。

group_list <- if (input$grouping_freq == 1) {
    list(yr=~year(my_date), mn=~month(my_date), dy=~day(my_date))
  } else if (input$grouping_freq == 2) {
    list(yr=~year(my_date), mn=~month(my_date))
  } else if (input$grouping_freq == 3) {
    list(yr=~year(my_date))
  } else {
    list()
  }

或者如果您更喜欢if语句,

group_list

然后您可以将renderTable传递到output$my_table <- renderTable({ df2() %>% group_by_(.dots=group_list) %>% summarise(dummy_data = sum(dummy_data), my_date = as.Date(min(my_date))) }) 表达式

ungroup

我不确定你的意思是“删除任何分组,因为数据已经是每天。”但是,如果数据可能已经分组,则可以在group_list中应用分组之前使用~功能删除任何组。

修改:忘记在列表元素中加入<GlobalNamingResources> <Resource name="properties/global" auth="Container" type="java.util.Properties" /> </GlobalNamingResources> ,以便正确评估。