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

R语言是否有核心函数可将函数f重复应用k次至值x?若无求地道写法

在R中重复应用函数k次的方法

R的基础核心包中并没有专门用于重复应用函数k次的内置函数,但有几种简洁且地道的实现方式,以下是常见方案:

基础R实现(最推荐的地道写法)

使用Reduce()函数

Reduce()是基础R中用于迭代聚合的标准函数,非常适合实现函数的重复应用:

nest <- function(f, x, k) {
  Reduce(function(current, .) f(current), seq_len(k), init = x)
}
  • 原理:init传入初始值x,seq_len(k)用来控制迭代次数(元素本身的值不影响,仅提供k次迭代的触发),每次迭代将当前结果传入函数f。
  • 示例:
add_one <- function(x) x + 1
nest(add_one, 1, 3) # 输出4,等价于add_one(add_one(add_one(1)))

递归实现

逻辑直观,但当k值很大时可能触发栈溢出:

nest_recursive <- function(f, x, k) {
  if (k == 0) x else nest_recursive(f, f(x), k - 1)
}

for循环实现

性能稳定,无栈溢出风险,适合大k场景:

nest_loop <- function(f, x, k) {
  res <- x
  for (i in seq_len(k)) res <- f(res)
  res
}

tidyverse生态实现

如果使用purrr包(tidyverse的核心组件之一),可以用accumulate():

library(purrr)

nest_purrr <- function(f, x, k) {
  accumulate(seq_len(k), ~f(.x), .init = x) %>% last()
}

accumulate()会返回每一步的迭代结果,用last()提取最终的k次应用结果。

总结

  • 基础R中最简洁地道的写法是使用Reduce(),这是R社区处理迭代操作的标准方式。
  • 递归和循环更易理解,但Reduce()在代码简洁性和 idiomatic R 风格上更优。
  • 若使用tidyverse,purrr::accumulate()是符合生态风格的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:35:09