我正在尝试构建一个更加自定义版本的cumsum
以用于data.table,但我在第一步失败了:
numbers <- data.table(num=1:10)
sum <- 0
cumFunct <- function(n) {
sum <<- sum+n
return(sum)
}
numbers[, cum:=sapply(num, cumFunct)]
虽然这有效,但它非常不洁净。它还要求在运行函数之前将sum设置为0.
现在,我该如何以更清洁的方式写这个?基本上,如何在不使用全局变量的情况下将中间结果传递给cumFunct
的下一次迭代?
非常感谢!
答案 0 :(得分:2)
这样做的一种方法是使用数据表&#34;数字&#34;在函数内:
numbers <- data.table(num=1:10)
cumFunct <- function(n) {
sum <- sum(numbers[1:n])
return(sum)
}
numbers[, cum:=sapply(num, cumFunct)]
这不是最有效的方式,但根据您在自定义代码中的操作,可以改进它。
答案 1 :(得分:1)
答案也是一个问题:这是一种在这里有用的模式吗?
complicated.wizardry <- function(a,b){
a+b
}
cumlist <- function(sofar, remaining, myfn){
if(length(remaining)==1)return(c(sofar, myfn(sofar[length(sofar)],remaining[1])))
return ( cumlist( c(sofar, myfn(sofar[length(sofar)],remaining[1])),remaining[2:length(remaining)],myfn))
}
cumlist(0,1:10,complicated.wizardry)