在 R/Tidyeval 中的 RHS 上使用类胶水结构

2023-12-07

我花了几个小时试图在公式的 RHS 上粘上胶水,但没有任何线索。这是一个简单的表示。

meta <- function(x, var, suffix){
  x<- x %>% mutate("{{var}}_{suffix}":= 5)
  
  x<- x %>% mutate("{{var}}_{suffix}_new":= {{var}} - "{{var}}_{suffix}")
  
  
}

x<- meta(mtcars, mpg, suf)

#Should be equivalent to

x<- mtcars %>% mutate(mpg_suf:= 5)

x<- x%>% mutate(mpg_suf_new:= mpg - mpg_suf)

#N: Tried https://stackoverflow.com/questions/70427403/how-to-correctly-glue-together-prefix-suffix-in-a-function-call-rhs but none of the methods in it worked, unfortunately

元函数给我“local_error_context(点=点,.index = i,掩码=掩码)中的错误: 承诺已在评估中:递归默认参数引用或早期问题? ”

浏览了 SO 上搜索词的所有点击,但目前没有任何效果。

非常感谢任何见解。谢谢你!


这是一个工作版本:

meta <- function(x, var, suffix){
  new_name <- rlang::englue("{{ var }}_{{ suffix }}")
  x %>%
    mutate("{new_name}" := 5) %>%
    mutate("{new_name}_new" := {{ var }} - .data[[new_name]])
}

names(meta(mtcars, mpg, suf))
#>  [1] "mpg"         "cyl"         "disp"        "hp"
#>  [5] "drat"        "wt"          "qsec"        "vs"
#>  [9] "am"          "gear"        "carb"        "mpg_suf"
#> [13] "mpg_suf_new"

要了解发生了什么:

  • 了解之间的区别"{{ var }}" and "{var}"在 tidyeval 粘合字符串中:https://rlang.r-lib.org/reference/glue-operators.html

  • 学习关于englue()在 LHS 之外创建粘合字符串:=: https://rlang.r-lib.org/reference/englue.html。这部分不是必需的,但我认为创建和重用变量会更好。

  • 棘手的部分是,您创建一个具有构造名称的新列,然后想要使用该名称引用的新列。你必须将其子集化为.data, see: https://rlang.r-lib.org/reference/dot-data.html

另请参阅一般主题:https://rlang.r-lib.org/reference/topic-data-mask-programming.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 R/Tidyeval 中的 RHS 上使用类胶水结构 的相关文章

随机推荐