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)
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?
Verwandte Frage zu SO: R data.table-Funktion erkennt ein bereits angegebenes Argument nicht
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: