Data.table: dcast.data.table eval(fun.aggragate) -- gagal saat dipanggil di dalam fungsi dengan deklarasi fungsi agregasi internal

Dibuat pada 2 Okt 2015  ·  4Komentar  ·  Sumber: Rdatatable/data.table

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

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:

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)

Semua 4 komentar

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?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat