我该如何处理?
d <- data.table(
a = c(1, 2, 3)
)
a <- 2
d[a == a]
Run Code Online (Sandbox Code Playgroud)
给出:
a
1: 1
2: 2
3: 3
Run Code Online (Sandbox Code Playgroud)
预期结果是:
a
1: 2
Run Code Online (Sandbox Code Playgroud)
我也无意中沦为猎物。这与范围界定有关,而不仅仅是data.table(dplyr会做同样的事情)。function通过定义一个在父(或全局)环境中掩盖同名变量的变量,您可以在主体中发现类似的问题。
a <- 1
# a brain-dead example
myfunc <- function() {
a <- 2
a - a
}
Run Code Online (Sandbox Code Playgroud)
在该function示例中,显而易见的a是哪个地方完全模棱两可,但实际上在您的问题中是同一回事。在任何时候是安全的假设不平等的LHS或RHS是始终里面的数据,另一个是始终之外; 如果找不到任何内容,则搜索从内部开始,向外部移动。由于==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())]
Run Code Online (Sandbox Code Playgroud)