library(dplyr)
Run Code Online (Sandbox Code Playgroud)
玩具数据集:
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
Run Code Online (Sandbox Code Playgroud)
这很好用:
df %>% filter(y == 5)
x y
1 2 5
Run Code Online (Sandbox Code Playgroud)
这也很好:
z <- 5
df %>% filter(y == z)
x y
1 2 5
Run Code Online (Sandbox Code Playgroud)
但这失败了
y <- 5
df %>% filter(y == y)
x y
1 1 4
2 2 5
3 3 6
Run Code Online (Sandbox Code Playgroud)
显然,dplyr无法区分其列y和全局变量y.有没有办法告诉dplyr第二个y是全局变量?
Spa*_*man 11
你可以做:
df %>% filter(y == .GlobalEnv$y)
Run Code Online (Sandbox Code Playgroud)
要么:
df %>% filter(y == .GlobalEnv[["y"]])
Run Code Online (Sandbox Code Playgroud)
要么:
两者都在这种情况下工作,但如果所有这一切都在一个函数内部进行,则不会.但是get会:
df %>% filter(y == get("y"))
f = function(df, y){df %>% filter(y==get("y"))}
Run Code Online (Sandbox Code Playgroud)
所以使用get.
或者只是使用df[df$y==y,] 而不是 dplyr.
可以通过.GlobalEnv对象访问全局环境:
> filter(df, y==.GlobalEnv$y)
x y
1 2 5
Run Code Online (Sandbox Code Playgroud)
有趣的是,使用访问器函数globalenv()作为替代品.GlobalEnv在这种情况下不起作用.