我想允许我的函数的用户使用任意列名,并且我需要在 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
Run Code Online (Sandbox Code Playgroud)
有很多与通过变量引用列名相关的问题,但我找不到避免这种极端情况的解决方案,即用户碰巧使用与我的引用变量相同的列名。
最近在 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
Run Code Online (Sandbox Code Playgroud)
因为它目前不在 CRAN 上,所以您需要从我们类似 CRAN 的存储库安装 data.table。请注意,我们也发布 Windows 二进制文件,因此不需要 Rtools。从我们的存储库安装最简单的方法是:
data.table::update.dev.pkg()
Run Code Online (Sandbox Code Playgroud)