【发布时间】: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