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
相关产品推荐
相关产品推荐

