我想允许函数的用户使用任意列名,我需要在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的repo中安装data.table。请注意,我们也发布windows二进制文件,因此不需要Rtools。从我们的回购安装最简单的方法是:
data.table::update.dev.pkg()
以下是quote
和eval.parent
的方法:
library(data.table)
dt=data.table(id='id1')
id='id'
dt[get(eval.parent(quote(id),1)) %in% 'id1',]
# id
#1: id1