【发布时间】:2015-04-08 13:27:19
【问题描述】:
我正在尝试使用 dplyr 执行两个表的内部连接,但我认为我被非标准评估规则绊倒了。当使用 by=("a" = "b") 参数时,当 "a" 和 "b" 是实际字符串时,一切都会按预期工作。这是一个有效的玩具示例:
library(dplyr)
data(iris)
inner_join(iris, iris, by=c("Sepal.Length" = "Sepal.Width"))
但是假设我将 inner_join 放入一个函数中:
library(dplyr)
data(iris)
myfn <- function(xname, yname) {
data(iris)
inner_join(iris, iris, by=c(xname = yname))
}
myfn("Sepal.Length", "Sepal.Width")
这会返回以下错误:
Error: cannot join on columns 'xname' x 'Sepal.Width': index out of bounds
我怀疑我可以做一些花哨的表达,去解析,引用或取消引用来完成这项工作,但我对这些细节有点模糊。
【问题讨论】:
-
Hadley 称其为 "non-standard evaluation" (NSE)
-
似乎不像 NSE 那样以不同的方式提供“by.x”和“by.y”列名。
by-argument 变成c("Sepal.Length" = "Sepal.Width"),所以by.x到merge的参数变成了真正的 R 名称。事实上,在我看来,它几乎与 NSE 正好相反。