You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言不调用cumsum实现向量累积和自定义函数方法

R语言无内置cumsum的自定义累积和函数实现

原有代码问题梳理

  • 循环变量错误:for (i in x)是直接遍历x内的元素值,并非遍历向量的位置索引,累积和计算需要按位置从前往后递推,应遍历位置序列1:length(x)
  • 子集取法错误:R中提取向量从起始到结束位置的子集语法是x[start:end],原有代码写的x[1]:x[i]是拿x[1]的数值和x[i]的数值生成整数序列,和取子集的逻辑完全不符
  • 返回逻辑错误:逐次用print()打印值不会生成和输入等长的结果向量,函数需要将每一步计算的结果存入预定义的向量,最终统一返回

实现思路

  • 先做入参合法性校验,拦截非数值向量的输入,同时处理空向量的边界场景
  • 预创建和输入向量等长的结果存储向量,避免循环中动态加长向量带来的性能损耗
  • 递推计算:第1位的累积和等于元素本身,从第2位开始,每一位的累积和 = 前一位的累积和 + 当前位置的原始值
  • 计算完成后直接返回结果向量,全程不调用内置cumsum()函数

可运行代码

my_cumsum <- function(x) {
  # 入参校验
  if (!is.numeric(x)) {
    stop("输入参数必须为数值向量")
  }
  input_len <- length(x)
  # 处理空输入边界情况
  if (input_len == 0) {
    return(numeric(0))
  }
  # 初始化等长结果向量
  result <- numeric(input_len)
  # 首位累积和为元素自身
  result[1] <- x[1]
  # 从第二位开始递推计算
  for (pos in 2:input_len) {
    result[pos] <- result[pos - 1] + x[pos]
  }
  return(result)
}

测试验证

# 测试用例
test_vec <- c(3, 1, 4, 1, 5, 9)
my_cumsum(test_vec)
# 输出结果:[1]  3  4  8  9 14 23

该递推实现时间复杂度为O(n),效率远高于每次循环从头计算前n项和的写法。

内容的提问来源于stack exchange,提问作者Ferrucio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:27:19