問題#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)
このケースも失敗するのを見るのは興味深いです:
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日にコメントされました」というコメントは、現在でも最善のアプローチですか?
SOに関する関連質問: Rdata.table関数はすでに指定された引数を認識しません
最も参考になるコメント
渡された関数の変数名が常に「fun.aggregate」である場合にのみ、問題#713が修正されたように思われます。
この例は、前の例とは対照的に機能します。