Mengacu pada masalah #713, saya pikir saya baru saja menemukan bug terkait.
Mendeklarasikan dan meneruskan fungsi agregasi _within_ fungsi yang memanggil dcast.data.table gagal di mesin saya
R versi 3.2.2 (2015-08-14)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Berjalan di bawah: OS X 10.10.2 (Yosemite)
data.table_1.9.6
Berikut ini contohnya:
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)
Sangat menarik untuk melihat bahwa kasus ini juga gagal:
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)
Tampaknya bagi saya bahwa masalah #713 telah diperbaiki hanya jika nama variabel untuk func yang diteruskan selalu "fun.aggregate":
Contoh ini bekerja berbeda dengan yang sebelumnya:
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)
Saya pikir saya mengalami masalah dengan bug ini, tetapi saya ingin memastikan bahwa itu adalah masalah yang sama. Saya mencoba mendefinisikan fun.aggregate dalam suatu fungsi sebelum panggilan ke dcast. Contoh sepele:
wrapper <- function() {
f <- function(x) list(x)
dcast(data, y ~ x + b, fun.aggragate = f)
}
Saya telah mencoba untuk mencoba menemukan f menggunakan get() dengan menargetkan lingkungan sys.call tertentu. Saya juga mencoba melampirkan f ke new.env() dari lingkungan dasar. Jadi, apakah komentar "d0rg0ld commented on Oct 2, 2015" masih merupakan pendekatan terbaik saat ini?
Pertanyaan terkait pada SO: Fungsi R data.table tidak mengenali argumen yang sudah ditentukan
Komentar yang paling membantu
Tampaknya bagi saya bahwa masalah #713 telah diperbaiki hanya jika nama variabel untuk func yang diteruskan selalu "fun.aggregate":
Contoh ini bekerja berbeda dengan yang sebelumnya: