我对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))
...会让我在那里,但这似乎不起作用。有什么想法吗?
答案 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")