r - 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)
我想我需要为该过程定义一个停止,但是如何?
解决方案
您可以使用累积和来实现所需的结果。这将向量中的所有先前值相加,该向量实际上与您的递归循环相同:
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 循环,因为该函数未矢量化,因此不确定它是否真的有帮助。
推荐阅读
- django - 在更新方法中序列化外键变量
- gcc - 将 math.h 与 gprbuild 链接
- arrays - 如何以角度推送具有已定义对象的数组值
- php - 如何使用具有 php href 的 html 按钮传递参数
- javascript - 如何使用nodejs puppeteer切换到新打开的窗口?
- python - 如何使用openpyxl在excel单元格中打印带有下标或上标的变量?
- python - 使用 .pb 文件使用张量流图
- spring - Spring Kafka 中的偏移量是如何提交的?
- select - 用于选择图层的 Photoshop 操作管理器代码,忽略图层 ID,错误?
- sql - 我们可以同时使用 Join、Case 和 where 子句吗