Data.table: dcast.data.table eval(fun.aggragate) -- schlägt fehl, wenn innerhalb der Funktion mit interner Aggregationsfunktionsdeklaration aufgerufen wird

Erstellt am 2. Okt. 2015  ·  4Kommentare  ·  Quelle: Rdatatable/data.table

In Bezug auf Ausgabe 713 glaube ich, dass ich gerade einen verwandten Fehler gefunden habe.

Das Deklarieren und Übergeben einer Aggregationsfunktion _innerhalb_ einer Funktion, die dcast.data.table aufruft, schlägt auf meinem Computer fehl

R-Version 3.2.2 (2015-08-14)
Plattform: x86_64-apple-darwin13.4.0 (64-Bit)
Läuft unter: OS X 10.10.2 (Yosemite)
data.table_1.9.6

Hier ist ein Beispiel:

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

Hilfreichster Kommentar

Es scheint mir, dass das Problem #713 nur behoben wurde, wenn der Variablenname für die übergebene Funktion immer "fun.aggregate" lautet:

Dieses Beispiel funktioniert im Gegensatz zum vorherigen:

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)

Alle 4 Kommentare

Es ist interessant zu sehen, dass auch dieser Fall fehlschlägt:

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)

Es scheint mir, dass das Problem #713 nur behoben wurde, wenn der Variablenname für die übergebene Funktion immer "fun.aggregate" lautet:

Dieses Beispiel funktioniert im Gegensatz zum vorherigen:

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)

Ich glaube, ich habe ein Problem mit diesem Fehler, aber ich wollte sichergehen, dass es sich um dasselbe Problem handelt. Ich habe versucht, vor einem Aufruf von dcast ein fun.aggregate innerhalb einer Funktion zu definieren. Ein triviales Beispiel:

wrapper <- function() {
  f <- function(x) list(x)
  dcast(data, y ~ x + b, fun.aggragate = f)
}

Ich hatte versucht, f mit get() zu finden, indem ich auf bestimmte sys.call-Umgebungen abzielte. Ich habe auch versucht, f aus der Basisumgebung an eine new.env()-Datei anzuhängen. Ist der Kommentar "d0rg0ld am 2. Oktober 2015 kommentiert" also immer noch der beste Ansatz?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen