如何避免数据变量与环境变量同名时出现恒真判断问题?
区分dplyr中同名的数据变量与环境变量
当数据框的列名(data-variable)和函数参数/环境变量(env-variable)同名时,dplyr的filter会因变量歧义出现恒为TRUE的无意义判断,导致过滤失效。比如:
library(dplyr) cyl <- 8 # 非预期结果:未过滤任何数据 fn_a <- function(data, cyl){ data %>% filter(cyl == cyl) %>% select(cyl) } mtcars %>% fn_a(cyl) #> cyl #> Mazda RX4 6 #> Mazda RX4 Wag 6 #> Datsun 710 4 #> Hornet 4 Drive 6 #> ...(其余所有行)
不用重命名函数参数也能解决这个问题,以下是两种可行方案:
方案1:使用.data代词指定数据列
dplyr提供的.data特殊对象可明确指代当前数据框中的列,以此区分环境变量:
fn_a <- function(data, cyl){ data %>% filter(.data$cyl == cyl) %>% select(cyl) } mtcars %>% fn_a(cyl) #> cyl #> Hornet Sportabout 8 #> Duster 360 8 #> Merc 450SE 8 #> ...(仅cyl=8的行)
.data$cyl明确指向数据框内的cyl列,右侧的cyl则对应函数参数传入的环境变量。
方案2:使用enquo()+!!解引用环境变量
通过enquo()捕获环境变量的表达式,再用!!解引用,明确区分数据列与环境变量:
fn_a <- function(data, cyl){ # 捕获环境中的cyl变量 target_cyl <- enquo(cyl) data %>% filter(cyl == !!target_cyl) %>% select(cyl) } mtcars %>% fn_a(cyl) #> 输出结果与方案1一致
这里enquo(cyl)抓取了函数参数对应的环境变量,!!将其插入到过滤条件中,左侧的cyl默认匹配数据列。
内容的提问来源于stack exchange,提问作者mac
相关产品推荐
相关产品推荐

