Data.table: dcast.data.table eval(fun.aggragate) -- 使用内部聚合函数声明在函数内部调用时失败

创建于 2015-10-02  ·  4评论  ·  资料来源: Rdatatable/data.table

参考 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)

最有用的评论

在我看来,仅当传递的 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)

所有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)

在我看来,仅当传递的 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 日发表评论”评论仍然是目前最好的方法吗?

此页面是否有帮助?
0 / 5 - 0 等级