【问题标题】:Shiny - Web Framework for R › how to use an input switch to conditionally groupShiny - R 的 Web 框架 › 如何使用输入开关有条件地分组
【发布时间】:2016-08-17 00:38:24
【问题描述】:

在闪亮的谷歌组上问过这个问题,但没有任何帮助:我正在努力解决如何在下面的代码中将输入开关传递给 dplyr 的 group_by_。

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

实际上,如果用户在 UI 中选择“每天”,则结果分组应该是第 24 行中的 group_by(year = year(my_date), month = month(my_date), day = day(my_date),或者删除 ANY分组,因为数据已经是每天了。

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

“每年”,应该产生 group_by(year = year(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)

【问题讨论】:

  • 您可以使用do.call 提供动态参数列表。

标签: r shiny dplyr


【解决方案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)))

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

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()
  }

然后您可以将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 中的分组之前删除任何组。

编辑:忘记在列表元素中包含~,以便它们正确评估。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 2020-03-26
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多