避免R中的for循环产生序列

我经常发现自己在R中使用下面的构造:

a <- c(1, rep(NA, 20)) rate <- 1.2 for (i in 2:length(a)){ a[i] <- a[i-1]*rate } which yields: > a [1] 1.000000 1.200000 1.440000 1.728000 2.073600 ... 

什么会是一个更“R”的方式来完成这一点,避免for / while循环

在电子表格中这么做很容易!

在这里输入图像说明

以下相关问题不会回答我的问题:
避免R中的循环
如何避免这个数据集中的循环?

对于你的具体例子, cumprod函数是一个简单的方法来做到这一点:

 a <- c(1, rep(1.2, 20) ) a <- cumprod(a) 

更一般地,如果你的程序没有cum函数,但是你想要这种types的function,那么你也可以使用Reduce函数:

 a <- c(1, rep(1.2, 20)) a <- Reduce(`*`, a, accumulate=TRUE) 

但是考虑一下,虽然在R中避免循环有一定的优雅,但是从实际的angular度来看,循环可能是最快的总体回答(当包括编程和运行时间时)。 R中的循环已经被优化,可以相当快地运行(除非你创build了一个非常糟糕的循环,但是你是一个有效的方法来做事情的例子),而且通常如果你能想到循环的方法,那么vector化所节省的时间可能是less于考虑如何进行vector化的额外时间。 除非这么长时间的循环要做很多次,否则节省的时间可能太小了(见fortune(98) )。 在vector很长的情况下, for循环和vector化的select可能会不同,所以问题可能比速度更重要。

学习替代方法对于提高你的知识/编程技能是很好的,对很多代码来说都是很好的简化器,只是觉得你总是不得不去寻找替代方法。

当幂函数^被vector化时,可以创build一系列索引并提高您的速度。

 rate <- 1.2 a <- rate^(0:19) 
Interesting Posts