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

use*_*796 9 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"))
Run Code Online (Sandbox Code Playgroud)

这很好用:

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

现在我创建自己的函数,它也有效:

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

在这里我做同样的事情,但我在一个函数中创建一个私有函数.然而,这失败了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)
Run Code Online (Sandbox Code Playgroud)

那有什么办法吗?我真正想做的是使函数名称f2动态化,以便我传入,比方说,"f3",它将调用私有函数f3.

我希望有类似的东西

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

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

use*_*796 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")
Run Code Online (Sandbox Code Playgroud)