簡體   English   中英

使用dplyr編程的可選參數

[英]Optional argument programming with dplyr

我是dplyr編程的dplyr 假設我有這樣的函數:

example <- function(data, group, var){

  group <- enquo(group)
  var <- enquo(var)

  data %>% 
    group_by(!! group) %>% 
    summarise(
      Min = min(!! var),
      Max = max(!! var)
    )  
} 

> diamonds %>% example(cut, price)
# A tibble: 5 x 3
  cut         Min   Max
  <ord>     <dbl> <dbl>
1 Fair        337 18574
2 Good        327 18788
3 Very Good   336 18818
4 Premium     326 18823
5 Ideal       326 18806

我想添加一個新的參數sort 如果未指定,則該函數不執行任何操作,如果指定函數確實arrange(desc(sort))

我嘗試過這樣的事情:

example <- function(data, group, var, sort = NULL){

  sort <- enquo(sort)
  group <- enquo(group)
  var <- enquo(var)

  data <- 
    data %>% 
    group_by(!! group) %>% 
    summarise(
      Min = min(!! var),
      Max = max(!! var)
    )

  if(is.null(sort)) data
  else arrange(data, desc(!! sort))

}

它在指定sort參數時有效

> diamonds %>% example(cut, price, sort = Min)
# A tibble: 5 x 3
  cut         Min   Max
  <ord>     <dbl> <dbl>
1 Fair        337 18574
2 Very Good   336 18818
3 Good        327 18788
4 Premium     326 18823
5 Ideal       326 18806

但是,如果我將sort留空,我會收到錯誤消息:

錯誤:無法在位置1排列類'NULL'的列

我怎樣才能解決這個問題 ? 感謝您的幫助,對不起英語不好意思

移動sort <- enquo(sort)的其他部分讓你更接近,但你仍然有一個問題,因為if(is.null(sort))如果你用行會返回一個錯誤sort = Min的功能,因為is.null將要評估Min對象,但不會找到它。

您可以使用missing ,而不是使用is.null ,它不會評估Min對象。

example <- function(data, group, var, sort = NULL){

  group <- enquo(group)
  var <- enquo(var)

  data <- 
    data %>% 
    group_by(!! group) %>% 
    summarise(
      Min = min(!! var),
      Max = max(!! var)
    )

  if(missing(sort)) {
    data
  } else { sort <- enquo(sort)
  arrange(data, desc(!! sort))
  }

}

現在我們得到以下輸出:

diamonds %>% example(cut, price)

# A tibble: 5 x 3
  cut         Min   Max
  <ord>     <dbl> <dbl>
1 Fair        337 18574
2 Good        327 18788
3 Very Good   336 18818
4 Premium     326 18823
5 Ideal       326 18806

diamonds %>% example(cut, price, sort = Min)

# A tibble: 5 x 3
  cut         Min   Max
  <ord>     <dbl> <dbl>
1 Fair        337 18574
2 Very Good   336 18818
3 Good        327 18788
4 Premium     326 18823
5 Ideal       326 18806

請參閱測試對NULL參數使用enquo()的函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM