如何将变量列表传递给函数,但也考虑了 quosures 和引用

How to pass a list of of variables to a function but also considering quosures and quoting

我想将变量列表传递给函数,但我对引号和引号感到困惑。

通常,我想 return 在完成某种数据管理之后——在将函数应用到多个变量之后,我想要一个 df。

因为它是函数工作正常(只是从用户堆栈交换 稍微修改到另一个问题),但在这个例子中调用是重复的。任何建议,指向读数或等,我将不胜感激。

library(tidyverse)
library(rlang)
library(tidyselect)

data <- data.frame(ageeeeoo = c(1,NA,3,NA,5), 
                   ageeeaah = c(NA,2,NA,4,NA),
                   numnumd  = c(1,NA,3,NA,5),
                   numfoofe = c(NA,2,NA,4,NA))



newfun <- function (var1) {

var1<-enquo(var1)
data<<-mutate(data,(!!as_name(var1)) := coalesce(!!! syms(vars_select(names(data), 
                                       starts_with(as_name(var1))))))
}


newfun(age)
newfun(num)



  ageeeeoo ageeeaah numnumd numfoofe age num
        1       NA       1       NA   1   1
       NA        2      NA        2   2   2
        3       NA       3       NA   3   3
       NA        4      NA        4   4   4
        5       NA       5       NA   5   5

我尝试查看 dplyr 编程文档和其他一些堆栈交换 但引用让我失望。我试过使用 alist 和 list 但出现错误。

listofvars<-c("age","num")

newfun <- function (...) {

data<<-mutate(data,(!!!rlang::syms(...)) := coalesce(!!! syms(vars_select(names(data),
                                            starts_with(!!!quos(...))))))
}


  newfun(listofvars)
library(tidyverse)
library(rlang)
library(tidyselect)

data <- data.frame(ageeeeoo = c(1,NA,3,NA,5), 
                   ageeeaah = c(NA,2,NA,4,NA),
                   numnumd  = c(1,NA,3,NA,5),
                   numfoofe = c(NA,2,NA,4,NA))



newfun2 <- function (data, ...) {

  vars <- ensyms(..., .named = TRUE)
  needed <- map(
    vars,
    ~vars_select(names(data), starts_with(as_name(.x))) %>% 
    {quo(coalesce(!!!syms(.)))}
  )
  mutate(data, !!!needed)
}

data <- newfun2(data, age, num)

list_of_vars <- exprs(age, num)
data <- newfun2(data, !!!list_of_vars)
data

这首先将来自 ... 的输入捕获为符号。它可以使用 purrr::map 生成 coalesce 操作列表。然后将这些提供给 mutate。我重写了代码,以免修改函数内的全局环境;大多数 R 代码都是这样工作的,所以一般情况下变量不会被改变,除非通过显式赋值。

rlang 帮助和 Hadley Wickham’s advanced R 是很好的资源。