【问题标题】:R data.table scoping, reliably refer to unknown column name using variableR data.table 范围,使用变量可靠地引用未知列名
【发布时间】:2021-05-27 19:03:14
【问题描述】:

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

有很多与通过变量引用列名相关的问题,但我找不到一个解决方案来避免这种极端情况,即用户碰巧使用与我的引用变量相同的列名。

【问题讨论】:

标签: r data.table


【解决方案1】:

最近在 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()

【讨论】:

    【解决方案2】:

    这是quoteeval.parent 的方法:

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

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 1970-01-01
      • 2022-01-15
      • 2016-03-30
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多