【问题标题】:Lazy evaluation to annotations expanding function对注释扩展功能的惰性求值
【发布时间】:2020-02-14 16:46:24
【问题描述】:

我编写了一个函数来扩展组内的注释。

function(data, group_col, expand_col){
  data %>%
    dplyr::group_by(!!rlang::ensym(group_col)) %>%
    dplyr::mutate( 
      !!rlang::ensym(expand_col) = dplyr::case_when(
        !is.na(!!rlang::ensym(expand_col)) ~ 
          !!rlang::ensym(expand_col) ,
        any( !is.na(!!rlang::ensym(expand_col))  ) & is.na(!!rlang::ensym(expand_col)) ~ 
          paste(unique(unlist(str_split(na.omit(!!rlang::ensym(expand_col)), " ")) ), collapse = " "),
        TRUE ~ 
          NA_character_  
      )
    ) %>%
    dplyr::ungroup()
}

这应该是这样的:

> t <- structure(list(a = c("a", "b", "c", "d", "e", "f", "g", "h"), 
    b = c(1, 1, 1, 1, 2, 2, 2, 2), c = c(NA, NA, NA, "D", "E", 
    NA, NA, NA)), row.names = c(NA, -8L), class = c("tbl_df", 
"tbl", "data.frame"))
> t
# A tibble: 8 x 3
  a         b c    
  <chr> <dbl> <chr>
1 a         1 NA   
2 b         1 NA   
3 c         1 NA   
4 d         1 D    
5 e         2 E    
6 f         2 NA   
7 g         2 NA   
8 h         2 NA  

让它变成它:

> t %>%
+   dplyr::group_by(b) %>%
+   dplyr::mutate( 
+     c = dplyr::case_when(
+       !is.na(c) ~ c ,
+       any( !is.na(c)  ) & is.na(c) ~ 
+         paste(unique(unlist(str_split(na.omit(c), " ")) ), collapse = " "),
+       TRUE ~ 
+         NA_character_  
+     )
+   ) %>%
+   dplyr::ungroup()
# A tibble: 8 x 3
  a         b c    
  <chr> <dbl> <chr>
1 a         1 D    
2 b         1 D    
3 c         1 D    
4 d         1 D    
5 e         2 E    
6 f         2 E    
7 g         2 E    
8 h         2 E    

任何人都知道这种方法有什么问题,或者有任何更好的策略来通过扩展一些先前分配的元素来分配组中的元素。

【问题讨论】:

  • 如果你传递不带引号的参数,一个选项是 curly-curly {{}}
  • 谢谢,我不知道这个卷发,我会立即搜索,谢谢。

标签: r dplyr lazy-evaluation


【解决方案1】:

一种选择是使用curly-curly ({{...}}) 以更紧凑的方式执行此操作

f1 <- function(data, group_col, expand_col){
  data %>%
    dplyr::group_by({{group_col}}) %>%
    dplyr::mutate( 
      {{expand_col}} := dplyr::case_when(
        !is.na({{expand_col}}) ~ 
          {{expand_col}} ,
      any( !is.na({{expand_col}})  ) & is.na({{expand_col}}) ~ 
        paste(unique(unlist(str_split(na.omit({{expand_col}}), " ")) ), 
                         collapse = " "),
      TRUE ~ 
        NA_character_  
    ))  %>%
    dplyr::ungroup()
}  



f1(t, b, c)
# A tibble: 8 x 3
#  a         b c    
#  <chr> <dbl> <chr>
#1 a         1 D    
#2 b         1 D    
#3 c         1 D    
#4 d         1 D    
#5 e         2 E    
#6 f         2 E    
#7 g         2 E    
#8 h         2 E    

【讨论】:

  • 我的 dplyr 版本是否可能不同并导致错误或我缺少某些库?我遇到了这个错误:Error in mutate_impl(.data, dots) : Evaluation error: object 'b' not found. 使用相同的示例。
  • 最后的错误:16. stop(structure(list(message = "Evaluation error: object 'b' not found.", call = mutate_impl(.data, dots), cppstack = NULL), class = c("Rcpp::eval_error", "C++Error", "error", "condition"))) 15. mutate_impl(.data, dots) 14. mutate.tbl_df(.data, !!!mutate_vars) 13. mutate(.data, !!!mutate_vars)
  • @AurelianoGuedes。你能检查你的rlangdplyr 版本吗?我用packageVersion('rlang') [1] ‘0.4.0’ ;packageVersion('dplyr') [1] ‘0.8.3’
  • @AurelianoGuedes。 {{}} 是在 rlang 0.4.0 中引入的
  • 我有R版R 3.6
猜你喜欢
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
相关资源
最近更新 更多