2016-08-17 66 views
0

在閃亮的谷歌組詢問這個,w沒有幫助:我正在努力如何在下面的代碼中將輸入開關傳遞給dplyr的group_by_ 。閃亮 - R的Web框架>如何使用輸入切換條件組

我在下面的not-so-MRE中粗體顯示了相關代碼的兩部分(即行911和24)。

如果用戶在用戶界面中選擇「每日」,則生成的分組應該是第24行中的group_by(year = year(my_date),month = month(my_date),day = day(my_date)或remove任何分組的數據每日了。

選擇 「按月」,應產生GROUP_BY(年=年(my_date),月=月(my_date))

「每年」,應產生GROUP_BY(年= 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) 
+0

您可以使用'do.call'來提供一個動態的參數列表。 – sdgfsdh

回答

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_listrenderTable表達

output$my_table <- renderTable({ 
    df2() %>% 
    group_by_(.dots=group_list) %>% 
    summarise(dummy_data = sum(dummy_data), my_date = as.Date(min(my_date))) 
}) 

我不知道你所說的「刪除任何分組是什麼意思因爲數據已經是每天都有。「但如果數據可能已分組,則可以在應用group_list中的分組之前使用ungroup函數刪除任何組。

編輯:忘記在列表元素中包含~以便它們正確評估。