Referindo-se ao problema # 713, acho que acabei de encontrar um bug relacionado.
Declarar e passar uma função de agregação _dentro_ de uma função que chama dcast.data.table falha em minha máquina
R versão 3.2.2 (2015-08-14)
Plataforma: x86_64-apple-darwin13.4.0 (64 bits)
Executando em: OS X 10.10.2 (Yosemite)
data.table_1.9.6
Aqui está um exemplo:
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)
É interessante ver que este caso também falha:
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)
Parece-me que o problema # 713 foi corrigido apenas se o nome da variável para a função passada for sempre "fun.aggregate":
Este exemplo funciona em contraste com o 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)
Acho que estou tendo um problema com esse bug, mas queria ter certeza de que era o mesmo. Eu estava tentando definir um fun.aggregate dentro de uma função antes de uma chamada para dcast. Um exemplo trivial:
wrapper <- function() {
f <- function(x) list(x)
dcast(data, y ~ x + b, fun.aggragate = f)
}
Tentei encontrar f usando get (), direcionando ambientes sys.call específicos. Eu também tentei anexar f em um new.env () do ambiente base. Então, o comentário "d0rg0ld comentou em 2 de outubro de 2015" ainda é a melhor abordagem atualmente?
Pergunta relacionada no SO: R função data.table não reconhece um argumento já especificado
Comentários muito úteis
Parece-me que o problema # 713 foi corrigido apenas se o nome da variável para a função passada for sempre "fun.aggregate":
Este exemplo funciona em contraste com o anterior: