如何将变量列表传递给函数,但也考虑了 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 是很好的资源。
我想将变量列表传递给函数,但我对引号和引号感到困惑。
通常,我想 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 编程文档和其他一些堆栈交换
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 是很好的资源。