簡體   English   中英

避免R中的for循環生成序列

[英]avoid for-loop in R to generate series

我經常發現自己在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 ... 

避免for / while循環的一種更像“ R”的方式來完成此操作?

在電子表格中執行此操作是如此簡單!:

在此處輸入圖片說明

以下相關問題不會回答我的問題:
避免R中的for循環
如何避免該數據集中的for循環?

對於您的特定示例, cumprod函數是執行此操作的一種簡單方法:

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

更一般而言,如果您的過程沒有cum函數,但是您想要這種類型的功能,則還可以使用Reduce函數:

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

但是請考慮,盡管在避免R中循環方面有一定的風度,但從實際的角度來看,循環可能是最快的總體答案(當同時包括編程和運行時間時)。 R中的循環已經過優化,可以以相當快的速度運行(除非您創建了一個非常糟糕的循環,但是您的循環是做事的有效方法的一個示例),並且通常,如果您想到了這種循環方法,那么向量化所節省的時間可能是少於多余的時間去思考如何將其向量化。 除非要在很長的循環中多次執行此操作,否則節省的時間可能太小了(請參閱fortune(98) )。 在向量很長的情況下, for循環和向量化替代項之間的舍入可能會有所不同,因此問題可能比速度更重要。

學習for替代方法對於提高您的知識/編程技能非常有用,並且可以大大簡化許多代碼,只是不必覺得您總是必須找到for的替代方法。

當冪函數^被矢量化時,您可以創建一個索引序列並將其速率提高。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM