【问题标题】:R data.table function doesn't recognize an already-specified argumentR data.table 函数无法识别已经指定的参数
【发布时间】:2018-03-22 01:43:47
【问题描述】:

我遇到了一个奇怪的问题,即 data.table 函数在另一个函数中使用该函数时无法识别明确定义的参数。

这是一个简单的例子: 第一个函数testFun1时出现错误,

Error in fun(value) : could not find function "fun"

但是,很明显有fun的默认值。 使用reshape2::dcast 没有问题,请参阅testFun2

testFun1 <- function(data, formula, fun = sum, value.var = "value") {
  data.table::dcast(data = data, formula = formula, fun.aggregate = fun,
                    value.var = "value")
}

testFun2 <- function(data, formula, fun = sum, value.var = "value") {
  reshape2::dcast(data = data, formula = formula, fun.aggregate = fun,
                    value.var = "value")
}

d <- data.table(x = c("a", "b"), y = c("c", "d"), value = 1)
testFun1(d, x ~ y)
# Error in fun(value) : could not find function "fun"
testFun2(d, x ~ y)

【问题讨论】:

  • 可以确认 - 查看debug(data.table::dcast)testFun1fun.aggregate 对象似乎没有正确执行,它会寻找fun() 而不是sum()。如果您将testFun1 参数设为fun.aggregate=sum 并更新函数体中的引用,那么它会再次开始工作。不知道如何让它更普遍地工作。
  • 看起来这是 data.table 中的一个未解决问题; github.com/Rdatatable/data.table/issues/1369

标签: r function data.table


【解决方案1】:

made Arun 最近对 dcast 的改进已经解决了这个问题。它们很快就会作为 1.12.2 版本在 CRAN 上提供。

install.packages("data.table", repos="https://Rdatatable.gitlab.io/data.table")
library(data.table)
testFun1 <- function(data, formula, fun = sum, value.var = "value") {
  data.table::dcast(data = data, formula = formula, fun.aggregate = fun,
                    value.var = "value")
}

d <- data.table(x = c("a", "b"), y = c("c", "d"), value = 1)
testFun1(d, x ~ y)

testFun2 <- function(data, formula, fun = sum, value.var = "value") {
  reshape2::dcast(data = data, formula = formula, fun.aggregate = fun,
                  value.var = "value")
}

d <- data.table(x = c("a", "b"), y = c("c", "d"), value = 1)
all.equal(testFun1(d, x ~ y), as.data.table(testFun2(d, x ~ y)), check.attributes=FALSE)
#[1] TRUE

【讨论】:

    【解决方案2】:

    这似乎是以前版本的 data.table 中存在的错误,已修复,并且再次弹出。

    解决方案是将包装函数中的参数名称从 fun 更改为 fun.aggregate,使其与 data.table::dcast 参数的名称匹配。

    例子:

    testFun1 <- function(data, formula, fun.aggregate = sum, value.var = "value") {
      data.table::dcast(data = data, formula = formula, 
                        fun.aggregate = fun.aggregate, value.var = "value")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多