data.table列名等于变量名

Art*_*sov 4 r data.table

我该如何处理?

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)

r2e*_*ans 5

我也无意中沦为猎物。这与范围界定有关,而不仅仅是data.tabledplyr会做同样的事情)。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)