参考 issue #713 我想我刚刚发现了一个相关的错误。
在我的机器上声明和传递聚合函数 _within_ 调用 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)
在我看来,仅当传递的 func 的变量名称始终为“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 。 我还尝试从基础环境将 f 附加到 new.env() 中。 那么“d0rg0ld 于 2015 年 10 月 2 日发表评论”评论仍然是目前最好的方法吗?
关于 SO 的相关问题: R data.table 函数无法识别已指定的参数
最有用的评论
在我看来,仅当传递的 func 的变量名称始终为“fun.aggregate”时,问题 #713 才得到修复:
此示例与上一个示例形成对比: