Я пытаюсь использовать синтаксис квазицитирования (quo
, exprs
, !!
и т. д.), а также функцию foreach
для создания нескольких новых переменных с помощью именованного списка выражений, которые должны быть оценены внутри функции rxDataStep
, в частности, transforms
аргумент. Я получаю следующую ошибку:
Error in rxLinkTransformComponents(transforms = transforms, transformFunc = transformFunc, : 'transforms' must be of the form list(...)
У меня есть набор данных, который включает в себя ряд переменных, которые мне нужно преобразовать в журнал, чтобы выполнить дальнейший анализ. Я использую функции rx
из пакета "RevoScaleR" примерно три года и полностью пропустил "tidyverse"/конвейерный метод методов преобразования данных. Я иногда балуюсь этими инструментами, но предпочитаю придерживаться вышеупомянутых rx
функций, учитывая мое относительное знакомство и тот факт, что до сих пор они очень хорошо служили мне.
Как MWE:
Требуемые библиотеки:
library(foreach)
library(rlang)
Создание переменных, которые необходимо преобразовать в журнал.
vars <- foreach(i = 10:20, .combine = "cbind") %do% rnorm(10, i)
Фрейм данных с идентификатором и вышеуказанными переменными.
data_in <- data.frame(id = 1:10, vars)
Объект, который создает выражения логарифмически преобразованных переменных; это создает именованный список.
log_vars <- foreach(i = names(data_in[-1]), .final = function(x) set_names(x, paste0(names(data_in[-1]), "_log"))) %do%
expr(log10(!!sym(i)))
Теперь пытаемся добавить переменные в существующий фрейм данных.
data_out <- rxDataStep(inData = data_in, transforms = log_vars, transformObjects = list(log_vars = log_vars))
В результате ошибка следующая:
Error in rxLinkTransformComponents(transforms = transforms, transformFunc = transformFunc, : 'transforms' must be of the form list(...)
Я просто не могу понять ошибку, учитывая, что log_vars
определяется как именованный список. Это можно проверить с помощью str
и typeof
.
Я попробовал немного другой способ определения новых переменных:
log_vars <- unlist(foreach(i = names(data_in[-1]), j = paste0(names(data_in[-1]), "_log")) %do%
exprs(!!j := log10(!!sym(i))))
Я должен использовать unlist
, учитывая, что exprs
уже выдает список в качестве вывода. В любом случае, я получаю ту же ошибку, что и раньше.
Естественно, я ожидаю, что в кадр данных будет вставлено 10 новых переменных с именами result.1_log, result.2_log
и т. д. Вместо этого я получаю указанную выше ошибку, и новый кадр данных не создается.
Я подозревал, что функции rx
не любят работать с синтаксисом квазицитирования, однако я использовал его раньше, когда нужно было идентифицировать субъектов с нулевыми значениями некоторых переменных. Это было сделано с использованием аргумента rowSelection
функции rxDataStep
. Я понимаю, что для rowSelection
требуется одно логическое выражение, а для transforms
требуется именованный список выражений.
Любая помощь будет высоко оценена, так как этот тип преобразования данных снова будет поддерживаться в моих анализах. Я подозреваю, что просто не понимаю внутренней работы синтаксиса квазицитирования или, возможно, того, как работают списки в целом, но, надеюсь, есть простое решение.
Я использую Microsoft R Open 3.4.3.
Информация о моем сеансе следующая:
R Services Information:
Local R: C:\Program Files\Microsoft\ML Server\R_SERVER\
Version: 1.3.40517.1016
Operating System: Microsoft Windows 10.0.17134
CPU Count: 4
Physical Memory: 12169 MB, 6810 MB free
Virtual Memory: 14025 MB, 7984 MB free
Video controller[1]: Intel(R) HD Graphics 620
GPU[1]: Intel(R) HD Graphics Family
Video memory[1]: 1024 MB
Connected users: 1