dcast.data.table中的动态/私有函数名称

时间:2015-11-18 17:48:47

标签: r data.table

我对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))

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

1 个答案:

答案 0 :(得分:3)

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

感谢您指点我。

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

   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")