Refiriéndome al número 713, creo que acabo de encontrar un error relacionado.
Declarar y pasar una función de agregación _dentro de_ una función que llama a dcast.data.table falla en mi máquina
R versión 3.2.2 (2015-08-14)
Plataforma: x86_64-apple-darwin13.4.0 (64 bits)
Ejecutando bajo: OS X 10.10.2 (Yosemite)
data.table_1.9.6
Aquí hay un ejemplo:
testdata=data.table(c(1,1, 1, 2, 2), c(1,2,3, 4, 5), c( "a", "a", "b", "a", "b"))
colnames(testdata)=c("ID", "VAL", "CLASS")
#test dcast.data.table within function with internally declared aggregate fun -> FAILS
test_dcast_dt2 <- function(data) {
testfunc2 <- function(x) {
sum(x)
}
data_cast=dcast.data.table(data, "ID ~ CLASS", value.var="VAL", fun.aggregate=testfunc2)
}
res2=test_dcast_dt2(testdata)
Es interesante ver que este caso también falla:
testdata=data.table(c(1,1, 1, 2, 2), c(1,2,3, 4, 5), c( "a", "a", "b", "a", "b"))
colnames(testdata)=c("ID", "VAL", "CLASS")
test_dcast_dt <- function(data, aggfunc) {
data_cast=dcast.data.table(data, "ID ~ CLASS", value.var="VAL", fun.aggregate=aggfunc)
}
custom_sum <- function(x) {
sum(x)
}
res=test_dcast_dt(testdata, custom_sum)
Me parece que el problema # 713 se solucionó solo si el nombre de la variable para la función pasada es siempre "fun.aggregate":
Este ejemplo funciona en contraste con el anterior:
testdata=data.table(c(1,1, 1, 2, 2), c(1,2,3, 4, 5), c( "a", "a", "b", "a", "b"))
colnames(testdata)=c("ID", "VAL", "CLASS")
test_dcast_dt <- function(data, fun.aggregate) {
data_cast=dcast.data.table(data, "ID ~ CLASS", value.var="VAL", fun.aggregate=fun.aggregate)
}
custom_sum <- function(x) {
sum(x)
}
res=test_dcast_dt(testdata, custom_sum)
Creo que tengo un problema con este error, pero quería estar seguro de que era el mismo problema. Estaba tratando de definir un fun.aggregate dentro de una función antes de una llamada a dcast. Un ejemplo trivial:
wrapper <- function() {
f <- function(x) list(x)
dcast(data, y ~ x + b, fun.aggragate = f)
}
Intenté intentar encontrar f usando get () apuntándome a entornos sys.call específicos. También intenté adjuntar f en un new.env () desde el entorno base. Entonces, ¿el comentario de "d0rg0ld comentó el 2 de octubre de 2015" sigue siendo el mejor enfoque en la actualidad?
Pregunta relacionada en SO: la función R data.table no reconoce un argumento ya especificado
Comentario más útil
Me parece que el problema # 713 se solucionó solo si el nombre de la variable para la función pasada es siempre "fun.aggregate":
Este ejemplo funciona en contraste con el anterior: