R:在sapply

时间:2018-04-27 13:45:31

标签: r data.table sapply cumsum

我正在尝试构建一个更加自定义版本的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的下一次迭代?

非常感谢!

2 个答案:

答案 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)