R data.table作用域,使用变量可靠地引用未知列名



我想允许函数的用户使用任意列名,我需要在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()

以下是quoteeval.parent的方法:

library(data.table)
dt=data.table(id='id1') 
id='id'
dt[get(eval.parent(quote(id),1)) %in% 'id1',]
#    id
#1: id1

最新更新