这个问题在这里已经有了答案:
Subsetting data.table using variables with same name as column
(2 个回答)
2年前关闭。
我该如何处理这个案子?
d <- data.table(
a = c(1, 2, 3)
)
a <- 2
d[a == a]
给出:
a
1: 1
2: 2
3: 3
预期结果是:
a
1: 2
最佳答案
我也无意中成为了这个的牺牲品。这是关于一般范围的界定,而不仅仅是 data.table
( dplyr
会做同样的事情)。您可以在 function
中找到类似的问题。通过定义一个变量来屏蔽父(或全局)环境中的同名变量。
a <- 1
# a brain-dead example
myfunc <- function() {
a <- 2
a - a
}
在那
function
例如,“显然”存在完全歧义,其中 a
是哪个,但在您的问题中实际上是同一件事。假设不等式的 LHS 或 RHS 始终在数据内部,而另一个始终在外部,在任何时候都是不安全的;搜索从内部开始,如果没有找到就移到外部。因为在==
的两边里面都找到了,LHS 和 RHS 都使用“内部”。我想知道是否很难说“如果在 LHS 上发现它‘内部’,那么不要在 RHS 上查看‘内部’”,但我认为这增加了不必要的复杂性。特别是因为在 R 的正常变量搜索中有效地搜索变量,不一定是包代码中的手动代码。
最佳答案?不要这样做。解决方法?之一:
# this "should" always work, assuming "where" the external variable is defined
d[a == get("a", envir=parent.frame())]
# this only works if it is truly in the global environment
d[a == get("a", envir=globalenv())]
# and @nicola's suggestion:
d[a == evalq(a, envir=parent.frame())]
关于r - 列名等于变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57856049/