我想允许我的函数的用户使用任意列名,我需要在 data.table 中引用这些。从 var 获取列名是有效的,除非 var 的名称也是 dt 的列。我想要一个解决方案来修改我的引用方法(即 get(id)
),以便它在变量和列名重叠的情况下以及它们不重叠的情况下工作 - - 对于 data.table v1.14.0,当列与变量同名(包含所需的列引用)时,该列优先,这会破坏 get(id)
。
dt=data.table(id='id1')
id='id'
dt[get(id) %in% 'id1',] #fails
dt=data.table(subject='id1')
id='subject'
dt[get(id) %in% 'id1',] #works
有很多与通过变量引用列名相关的问题,但我找不到避免这种极端情况的解决方案,即用户碰巧使用与我的引用变量相同的列名。
最佳答案
最近在 data.table 中实现了针对这类问题的正确解决方案。有新的 env
参数,它没有 local-data.table 范围。用户不再需要使用 get
。
library(data.table)
dt=data.table(id='id1')
id='id'
dt[.id %in% 'id1', env=list(.id=id)]
# id
# <char>
#1: id1
因为它现在不在 CRAN 上,所以您需要从我们的类似 CRAN 的仓库中安装 data.table。请注意,我们也发布了 Windows 二进制文件,因此 Rtools 不是必需的。 从我们的仓库安装最简单的方法是:
data.table::update.dev.pkg()
关于R data.table 范围,使用变量可靠地引用未知列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67728442/