Динамически строить вызов для поиска нескольких столбцов

Как я могу динамически искать несколько полей и добавлять по ссылке с использованием символьной векторной переменной в качестве аргумента. В следующем случае я хочу найти два столбца и избавиться от 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 # 1: 1 1 x # 2: 2 1 v # 3: 3 1 f 

Я знаю подобный вопрос, но этот вопрос требует векторизованного аргумента во время соединения и прямого построения вызова для j .
edit: Я знаю, что могу это сделать, используя .SDcols но тогда я не могу выполнить это по ссылке

3 Solutions collect form web for “Динамически строить вызов для поиска нескольких столбцов”

Мне кажется, это самый простой способ:

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

Вот грубый способ:

 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 

Вместо mget или eval-parse все еще есть возможность построить поисковый вызов. В то время как mget является наиболее удобным для пользователя, он является гибким и фактически соответствует построению выражения j .
Решение завернуто в вспомогательную функцию batch.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 

Чтобы быть справедливым, этот ответ на самом деле затрагивает проблему строительства вызовов, описанную мной как OP.

Interesting Posts

Firefox 4 отображает весь текст как «полужирный»,

Изменение размера windows без полей в нижнем правом углу

Как отправить ошибку Windows 7?

Слишком много файлов журнала, созданных в папке Temp

Почему Chromium не может подключаться к http: // : 8080 / (то есть IPv6 localhost)?

Есть ли какое-либо программное обеспечение, которое может позволить мне сжечь тест нового жесткого диска, прежде чем я поместил свои данные на него?

Пользовательское название с изображением

оператор «<<» не соответствует этим операндам

Скорость передачи данных «логарифмически» уменьшается. Почему и может ли он быть улучшен?

Поддержание конечного состояния в конце анимации CSS3

Можно ли установить стиль отображения строк в Microsoft Word?

Как установить более старый OpenJDK 1.6 в Fedora 17?

Есть ли ярлык клавиатуры для закрытия окна командной строки?

Шаблон для вызова службы WCF с использованием async / wait

wWinmain, Unicode и Mingw

Давайте будем гением компьютера.