首页 > 解决方案 > R如何将具有递归滞后的for循环转换为函数?

问题描述

我可以使用这样的 for 循环计算递归变量:

df <- as.data.frame(cbind(1:10))

df$it <- NA
for(i in 1:length(df$V1)) {
  df$it <- 0.5*df$V1 + dplyr::lag(df$it, default = 0)
  }
df

但是我怎么能用一个动态的函数来做到这一点呢?以下产生错误“C 堆栈使用 15924032 太接近限制”:

adstwm <- function(x){
  0.5*x + adstwm(dplyr::lag(x, default = 0))
  }
adstwm(df$V1)

我想我需要为该过程定义一个停止,但是如何?

标签: rfunctionfor-looprecursionlag

解决方案


您可以使用累积和来实现所需的结果。这将向量中的所有先前值相加,该向量实际上与您的递归循环相同:

df$it_2 <- cumsum(0.5*df$V1)

如果您确实想创建递归函数,例如为了解决下面的评论,您可以包含一个 if 语句,使其停止:

function_it <- function(vector, length) {
  if (length == 1) 0.5*vector[length]
  else 0.5*vector[length] + 0.1*function_it(vector, length-1)
}

df$it <- NA
for(i in 1:length(df$V1)) { 
  df$it[i] <- function_it(df$V1,i)
} 
df 

但是,您仍然需要 for 循环,因为该函数未矢量化,因此不确定它是否真的有帮助。


推荐阅读