【问题标题】:R How to transform a for loop with recursive lag into a function?R如何将具有递归滞后的for循环转换为函数?
【发布时间】:2021-04-25 22:41:07
【问题描述】:

我可以用这样的 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 stack usage 15924032 is too close to the limit”:

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

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

【问题讨论】:

    标签: r function for-loop recursion lag


    【解决方案1】:

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

    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 循环,因为该函数未矢量化,因此不确定它是否真的有帮助。

    【讨论】:

    • 太棒了!但是,如果我只想要一部分延迟,例如: df$it
    • 在这种情况下,恐怕 cumsum() 函数将不起作用。递归函数可能是一个解决方案,我将编辑我的答案以包含一种使其停止的方法。
    • 我找到了一种将滞后的for循环放入函数cp的方法。我的回答
    【解决方案2】:

    我可以将滞后的 for 循环放入函数中,而无需递归函数:

    df <- as.data.frame(cbind(1:10))
    func.it2 <- function(x){
      df$it2 <- NA
      for(i in 1:length(df$V1)) {
        df$it2 <- 0.5*df$V1 + 0.1*dplyr::lag(df$it2, default = 0)
      }
      df$it2
      }
    func.it2(df$V1)
    df
    df$it2 <- func.it2(df$V1)
    df
    

    这行得通。但是为什么 df$it2 在我声明它(倒数第二行)之前不能作为 df 中的变量使用,尽管它已经在 for 循环中可用(第 5 行)?

    【讨论】:

    • 函数内部的变量不是全局环境的一部分,它们只存在于函数中。因此,it2 列是“临时”创建的,函数中的其余代码可以访问它,但不会在全局环境中创建。
    • 谢谢@pieterbons,明白了。
    猜你喜欢
    • 2013-05-31
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2013-01-04
    相关资源
    最近更新 更多