Data.table: dcast.data.table eval(fun.aggragate) - échoue lorsqu'il est appelé à l'intérieur d'une fonction avec une déclaration de fonction d'agrégation interne

Créé le 2 oct. 2015  ·  4Commentaires  ·  Source: Rdatatable/data.table

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)
bug

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 :

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)

Tous les 4 commentaires

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 ?

Cette page vous a été utile?
0 / 5 - 0 notes