【问题标题】:Dynamic / private function name in dcast.data.tabledcast.data.table 中的动态/私有函数名称
【发布时间】:2015-11-18 17:48:46
【问题描述】:

我对评估 data.table::dcast 调用中的函数名称的范围有疑问(data.table 版本 1.9.6,R 3.2.2)。

我想为函数命名,但是失败了。

这是我尝试过的:

library(data.table)
DT <- data.table(value = c(1:10),
                 cat1 = c("a", "b", "a", "b", "a", "b", "a", "b", "c", "a"),
                 cat2 = c("x", "x", "x", "y", "y", "y", "y", "y", "y", "x"))

这很好用:

result1 <- dcast.data.table(DT, cat1 ~ cat2, value.var = "value", fun = sum)

现在我制作了自己的函数,它也可以工作:

f1 <- function(x) {
    y <- sum(x) ^ 2
    return(y)
}
result2 <- dcast.data.table(DT, cat1 ~ cat2, value.var = "value", fun = f1)

在这里我做同样的事情,但我在函数中创建了一个私有函数。但是,Error in eval(expr, envir, enclos) : could not find function "f2" 失败。

如果我用 f1 替换 f2,它会起作用并调用 f1。看来是看全局环境来求值表达式fun=f2,而f2只存在于本地范围内。

testFunction <- function(DT1) {
    f2 <- function(x) {
        y <- sum(x) ^ 2
        return(y)
    }
    r3 <- dcast.data.table(DT1,cat1 ~ cat2, value.var = "value", fun = f2)
    return(r3)
}
result3 <- testFunction(DT)

有什么办法可以解决吗?我真正想做的是让函数名 f2 动态化,这样我传入,比如说“f3”,它就会调用私有函数 f3。

我希望像这样的东西

functionName = "f3"
r3 <- dcast.data.table(DT1, cat1 ~ cat2, value.var = "value", fun = get(functionName))

...会让我到达那里,但这似乎不起作用。有什么想法吗?

【问题讨论】:

  • 我认为这与bug #1369 相同——尚未修复。
  • 第一个问题很好,有一个清晰描述的问题、玩具数据和您尝试过的代码。欢迎来到 SO!当然还有 +1。

标签: r data.table


【解决方案1】:

根据错误报告,我现在可以通过使用名为“fun.aggregate”的参数来解决该问题。

谢谢你指点我。

下面的代码工作并实现了我所需要的。我可以传入一个预先存在的函数名称,例如均值或本地定义的函数。

   testFunction <- function(DT1,functionName="mean") {

    f2 <- function(x) {
        y <- sum(x) ^ 2
        return(y)
    }

    fun.aggregate <- get(functionName)

    r3 <- dcast.data.table(DT1,cat1~cat2,value.var="value",fun.aggregate=fun.aggregate)
    return(r3)
}
result3 <- testFunction(DT,"mean")
result4 <- testFunction(DT,"f2")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2014-12-01
    • 2017-03-18
    • 2015-05-09
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多