Dynamically build call for lookup multiple columns

牧云@^-^@ 提交于 2019-11-26 20:48:40

This seems to be the most straightforward way to me:

ID[JN, (select) := mget(paste0('i.', select))]

Here's the crude way:

myj <- parse(text=paste0("`:=`(",paste0(select,"=i.",select,collapse=","),")"))
ID[JN,eval(myj)]
#    id meta value
# 1:  1    1     x
# 2:  2    1     v
# 3:  3    1     f

Instead of mget or eval-parse there is still possibility to build the lookup call. While the mget is the most user friendly, this one is both flexible and actually corresponds to building the j expression.
Solution wrapped into batch.lookup helper function taking character vector of column names to lookup.

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

batch.lookup = function(x) {
    as.call(list(
        as.name(":="),
        x,
        as.call(c(
            list(as.name("list")),
            sapply(x, function(x) as.name(paste0("i.",x)), simplify=FALSE)
        ))
    ))
}
batch.lookup(select)
#`:=`(c("value", "meta"), list(value = i.value, meta = i.meta))
ID[JN, eval(batch.lookup(select))][]
#   id meta value
#1:  1    1     x
#2:  2    1     v
#3:  3    1     f

To be fair this answer actually address call construction issue described by me as OP.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!