如何使用字符向量变量作为参数动态查找多个字段并通过引用添加.在下面的情况下,我想查找两列并删除i.它们中的前缀.当然,他们可以覆盖具有相同名称的现有列.
library(data.table)
set.seed(1)
ID <- data.table(id = 1:3, meta = rep(1,3), key = "id")
JN <- data.table(idd = sample(ID$id, 3, FALSE), value = sample(letters, 3, FALSE), meta = rep(1,3), key = "idd")
select <- c("value","meta") # my fields to lookup
j.lkp <- call(":=", select, lapply(paste0("i.",select), as.symbol))
j.lkp
# `:=`(c("value", "meta"), list(i.value, i.meta))
ID[JN, eval(j.lkp)]
# Error in eval(expr, envir, enclos) : could not find function "i.value"
ID[JN, `:=`(c("value", "meta"), list(i.value, i.meta))]
# id meta value
# …Run Code Online (Sandbox Code Playgroud) 我正在使用很棒的 R data.table 包。然而,访问(即通过引用操作)具有变量名的列非常笨拙:如果给定一个dt具有两列 x 和 y 的 data.table,并且我们想要添加两列并将其命名为 z,那么命令是
dt = dt[, z := x + y]
Run Code Online (Sandbox Code Playgroud)
现在让我们编写一个函数,它以 data.table和三个列名add作为参数,并且假设仅使用通用列名执行与上面完全相同的命令。我现在使用的解决方案是反射,即dtsummand1Namesummand2NameresultName
add = function(dt, summand1Name, summand2Name, resultName) {
cmd = paste0('dt = dt[, ', resultName, ' := ', summand1Name, ' + ', summand2Name, ']')
eval(parse(text=cmd))
return(dt) # optional since manipulated by reference
}
Run Code Online (Sandbox Code Playgroud)
但是我对这个解决方案绝对不满意。首先,它很笨拙,这样的代码没有乐趣。它很难调试,而且只会让我生气并浪费时间。其次,它更难阅读和理解。这是我的问题:
我们可以用更好的方式编写这个函数吗?
我知道这样一个事实,即可以像这样访问具有变量名称的列:dt[[resultName]]但是当我写
dt[[resultName]] = dt[[summand1Name]] + dt[[summand2Name]]
Run Code Online (Sandbox Code Playgroud)
然后 data.table 开始抱怨已获取副本并且无法通过引用工作。我不想要这样。我也喜欢这种语法dt = dt[<all 'database related operations'>],这样我所做的一切都被放在一对括号中。是否可以使用反引号等特殊符号来指示当前使用的名称不是引用数据表的实际列,而是实际列名称的占位符?