En référence au problème #713, je pense que je viens de trouver un bogue connexe.
Déclarer et transmettre une fonction d'agrégation _dans_ une fonction appelant dcast.data.table échoue sur ma machine
R version 3.2.2 (2015-08-14)
Plate-forme : x86_64-apple-darwin13.4.0 (64 bits)
Fonctionnant sous : OS X 10.10.2 (Yosemite)
data.table_1.9.6
Voici un exemple:
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)
Il est intéressant de voir que ce cas échoue également :
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)
Il me semble que le problème n ° 713 n'a été résolu que si le nom de la variable pour la fonction transmise est toujours "fun.aggregate":
Cet exemple fonctionne contrairement au précédent :
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)
Je pense que j'ai un problème avec ce bug, mais je voulais être sûr que c'était le même problème. J'essayais de définir un fun.aggregate dans une fonction avant un appel à dcast. Un exemple trivial :
wrapper <- function() {
f <- function(x) list(x)
dcast(data, y ~ x + b, fun.aggragate = f)
}
J'avais essayé de trouver f en utilisant get() en ciblant des environnements sys.call spécifiques. J'ai également tenté d'attacher f dans un nouveau.env() à partir de l'environnement de base. Le commentaire "d0rg0ld commenté le 2 octobre 2015" est-il toujours la meilleure approche actuellement ?
Question connexe sur SO: la fonction R data.table ne reconnaît pas un argument déjà spécifié
Commentaire le plus utile
Il me semble que le problème n ° 713 n'a été résolu que si le nom de la variable pour la fonction transmise est toujours "fun.aggregate":
Cet exemple fonctionne contrairement au précédent :