R: Создайте пользовательскую функцию cumum в sapply - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь создать более персонализированную версию cumsum для использования в data.table, но у меня не получается на первом шаге:

numbers <- data.table(num=1:10)

sum <- 0

cumFunct <- function(n) {
  sum <<- sum+n
  return(sum)
}

numbers[, cum:=sapply(num, cumFunct)]

Хотя это работает, это очень нечисто. Также необходимо, чтобы сумма была установлена ​​на 0, прежде чем я запустил функцию.

Теперь, как мне написать это чище? По сути, как я могу передать промежуточный результат на следующую итерацию cumFunct без использования глобальных переменных?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Ответ, который также является вопросом: этот шаблон будет работать здесь?

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)
0 голосов
/ 27 апреля 2018

Один из способов сделать это - использовать датируемые «числа» внутри функции:

numbers <- data.table(num=1:10)

cumFunct <- function(n) {
  sum <- sum(numbers[1:n])
  return(sum)
}

numbers[, cum:=sapply(num, cumFunct)]

Это не самый эффективный способ, но в зависимости от того, что вы делаете в своем пользовательском коде, его можно улучшить.

...