我想编写一个在函数内使用dplyr::filter()
的函数。编写函数时,我在函数中使用参数名称时遇到了问题,该参数名称也是我正在过滤的数据帧的列之一的名称。
假设我将要过滤的数据帧称为dat
:
library(dplyr)
dat <- data.frame(
a = c(1:10),
b = c(2,2,2,2,2,3,1,1,4,4)
)
并将函数命名为test.filter()
,
test.filter <- function(b, test.data = dat){
dat.t <- filter(test.data,
b == b)
return(dat.t)
}
在这里,我要将值 b
传递给该函数,并要求其根据值{{1来过滤列 b
}}。我相信功能
b
应产生与
相同的结果test.filter(b = 4,
test.data = dat)
但是事实并非如此。我想知道是否在函数范围方面没有考虑什么。任何帮助表示赞赏!
答案 0 :(得分:2)
在这种情况下,函数的参数“ b”与列名相同。一种选择是在函数参数内进行!!
test.filter <- function(b, test.data = dat){
filter(test.data,
b == !!b)
}
test.filter(b = 4,
test.data = dat)
答案 1 :(得分:1)
如果传递给函数的参数类似于数据框中的列名之一,则可以使用{{ }}
中的curl-curly(rlang
)运算符来评估列名
library(rlang)
test.filter <- function(b, test.data = dat) {
dplyr::filter(dat,{{b}} == b)
}
test.filter(b = 4,test.data = dat)
# a b
#1 9 4
#2 10 4
test.filter(b = 2,test.data = dat)
# a b
#1 1 2
#2 2 2
#3 3 2
#4 4 2
#5 5 2
答案 2 :(得分:1)
感谢有用的答案。一位朋友让我知道,造成此问题的根本原因是dplyr使用了懒惰的eval,因此b==b
评估为true。