library(dplyr)
玩具数据集:
df <- data.frame(x = c(1, 2, 3), y = c(4, 5, 6))
df
x y
1 1 4
2 2 5
3 3 6
这很好用:
df %>% filter(y == 5)
x y
1 2 5
这也可行:
z <- 5
df %>% filter(y == z)
x y
1 2 5
但这失败了
y <- 5
df %>% filter(y == y)
x y
1 1 4
2 2 5
3 3 6
显然,dplyr无法区分其列y
和全局变量y
。
有没有办法告诉dplyr第二个y是全局变量?
答案 0 :(得分:9)
你可以这样做:
df %>% filter(y == .GlobalEnv$y)
或:
df %>% filter(y == .GlobalEnv[["y"]])
或:
这两个都在这种情况下起作用,但如果所有这一切都在一个函数内部进行,那就不会发生。但是get
会:
df %>% filter(y == get("y"))
f = function(df, y){df %>% filter(y==get("y"))}
因此请使用get
。
或者只使用df[df$y==y,]
代替 dplyr
。
答案 1 :(得分:6)
可以通过.GlobalEnv
对象访问全局环境:
> filter(df, y==.GlobalEnv$y)
x y
1 2 5
有趣的是,使用访问者函数globalenv()
代替.GlobalEnv
在这种情况下无效。