Data.table: dcast.data.table eval(fun.aggragate)-内部集計関数宣言を使用して関数内で呼び出されると失敗します

作成日 2015年10月02日  ·  4コメント  ·  ソース: Rdatatable/data.table

問題#713を参照すると、関連するバグが見つかったと思います。

dcast.data.tableを呼び出す関数内で集計関数を宣言して渡すと、マシンで失敗します

Rバージョン3.2.2(2015-08-14)
プラットフォーム:x86_64-apple-darwin13.4.0(64ビット)
実行中:OS X 10.10.2(Yosemite)
data.table_1.9.6

次に例を示します。

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

最も参考になるコメント

渡された関数の変数名が常に「fun.aggregate」である場合にのみ、問題#713が修正されたように思われます。

この例は、前の例とは対照的に機能します。

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)

全てのコメント4件

このケースも失敗するのを見るのは興味深いです:

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)

渡された関数の変数名が常に「fun.aggregate」である場合にのみ、問題#713が修正されたように思われます。

この例は、前の例とは対照的に機能します。

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)

このバグに問題があると思いますが、同じ問題であることを確認したかったのです。 dcastを呼び出す前に、関数内でfun.aggregateを定義しようとしていました。 ささいな例:

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

特定のsys.call環境をターゲットにして、get()を使用してfを見つけようとしました。 また、ベース環境からnew.env()にfをアタッチしようとしました。 では、「d0rg0ldは2015年10月2日にコメントされました」というコメントは、現在でも最善のアプローチですか?

このページは役に立ちましたか?
0 / 5 - 0 評価