Я пытался ответить на этот хороший вопрос о создании нестандартной функции оценки для объекта data.table, выполняя сгруппированное сумма. Акрун придумал прекрасный ответ, который я упрощу здесь:
akrun <- function(data, var, group){
var <- substitute(var)
group <- substitute(group)
data[, sum(eval(var)), by = group]
}
library(data.table)
mt = as.data.table(mtcars)
akrun(mt, cyl, mpg)
# group V1
# 1: 6 138.2
# 2: 4 293.3
# 3: 8 211.4
Я также работал над ответом, и у меня был почти такой же ответ, но с substitute
, встроенными в остальные. Мой приводит к ошибке:
gregor = function(data, var, group) {
data[, sum(eval(substitute(var))), by = substitute(group)]
}
gregor(mt, mpg, cyl)
# Error in `[.data.table`(data, , sum(eval(substitute(var))), by = substitute(group)) :
# 'by' or 'keyby' must evaluate to vector or list of vectors
# (where 'list' includes data.table and data.frame which are lists, too)
На первый взгляд, моя функция — простая замена функции Акруна. Почему это не работает?
Обратите внимание, что обе замены вызывают проблемы, как показано здесь:
gregor_1 = function(data, var, group) {
var = substitute(var)
data[,sum(eval(var)),
by = substitute(group)]
}
gregor_1(mt, mpg, cyl)
# Same error as above
gregor_2 = function(data, var, group) {
group = substitute(group)
data[,sum(eval(substitute(var))),
by = group]
}
gregor_2(mt, mpg, cyl)
# Error in eval(substitute(var)) : object 'mpg' not found
data.table
любые переменные, которые вы передаете вsubstitute
, остаются символами (например, если вы заключаете их вrleid
илиas.integer
предупреждение немного понятнее нубам вроде меня). Это правильно? Итак,substitute
не смотрит в среду функций при использовании внутри вызова data.table? Кроме того, я очень зеленый во всем, что касается data.table, поэтому прошу прощения, если это уже очевидно. - person Andrew   schedule 31.10.2019substitute(var, env = parent.frame(environment()))
, тоже безуспешно. Но, похоже, это правильный путь. - person Gregor Thomas   schedule 31.10.2019