Creación dinámica de llamadas para buscar múltiples columnas

¿Cómo puedo buscar de forma dinámica múltiples campos y agregar por referencia usando la variable de vector de caracteres como argumento? En el caso siguiente, quiero buscar dos columnas y deshacerme de i. prefijo en ellos. Por supuesto, pueden anular columnas ya existentes con el mismo nombre.

 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 # 1: 1 1 x # 2: 2 1 v # 3: 3 1 f 

Soy consciente de una pregunta similar, pero esta pregunta por un argumento vectorizado durante la unión y la creación directa de una llamada para j .
editar: Soy consciente de que puedo hacerlo usando .SDcols pero luego no puedo realizar esto por referencia

Esta parece ser la forma más directa para mí:

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

Aquí está la manera cruda:

 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 

En lugar de mget o eval-parse todavía hay posibilidad de construir la llamada de búsqueda. Mientras que el mget es el más amigable para el usuario, este es flexible y en realidad corresponde a la construcción de la expresión j .
Solución envuelta en la función auxiliar batch.lookup que toma el vector de caracteres de los nombres de las columnas para buscar.

 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 

Para ser justos, esta respuesta realmente aborda el problema de la construcción de llamadas que describí como OP.