R語言中的循環及其擴展:iter和foreach


R中有三種不同的循環結構:

1.repeat結構

它只是簡單的重復同一個表達式:repeat expression,如果要跳出循環,可以使用break命令,若要跳至循環中的下一輪迭代,需要使用next命令;如果在循環中不包括break命令,R代碼將會是一個無限循環。

因此,常用的結構如下:

repeat { 
   expression
   if(condition){
        break
   }
}

舉例如下:

# 求1-100的和
i <- 1
sum_100 <- 0
repeat{sum_100 = sum_100 + i
       i=i+1
       if(i>100){
         print(sum_100)
         break
       }
}

2.while結構:在某個條件為真時,重復某一特定的表達式

while(condition) expression

舉例如下:

> i <- 1
> sum_100 <- 0
> while(i<=100){sum_100=sum_100+i;i=i+1}
> print(sum_100)
[1] 5050

3. for循環結構可以遍歷向量或者列表中的每個元素:

for(var in list) expression

舉例如下:

> for(i in seq(from=1,to=100,by=1)) sum_100=sum_100+i
> sum_100
[1] 5050

 4.循環擴展

我們都知道C#或者java等現代編程語言中,都會有foreach等迭代器。R語言本身並沒有提供這樣的機制,不過我們可以通過R語言添加包來實現

(1)迭代器:從另外一個對象中返回元素的抽象對象。使用迭代器可以使代碼具有更好的可讀性同時易於並行執行。添加R語言擴展包iterators可以實現迭代器功能。迭代器可以返回向量、數組、數據框或者其他對象的元素,當然也可以返回函數。

iter(obj,checkFunc=function(...) TRUE,recycle=FALSE,...)
# obj 指定對象
# checkFunc 指定一個過濾迭代器返回值的函數
# recyle 指定當對象元素迭代完成之后是否對迭代進行重置

舉例如下:

> iter_one <- iter(1:10,checkFunc=function(x) x%%2==0,recycle=F)
> nextElem(iter_one)   #nextElem()函數用來查看下一個迭代項,這個函數會隱式地調用checkFunc,如果下一個值符合checkFunc,則返回該值,否則將迭代下一個值,直至找到一個符合checkFunc的值或者將所有值都迭代完畢
[1] 2
> nextElem(iter_one)
[1] 4
> nextElem(iter_one)
[1] 6
> nextElem(iter_one)
[1] 8
> nextElem(iter_one)
[1] 10
> nextElem(iter_one)
Error: StopIteration   #由於設定了recycle=F(也是默認值),迭代完成后,再次調用nextElem()函數將會出現Error:StopIteration.如果設置recycle=T,此時迭代將重置,再次輸出2,4,6,8,10

(2)foreach循環:該功能通過R語言擴展包foreach實現,foreach能夠循環遍歷某個對象(向量、矩陣、數據框或者迭代器)中的多個元素,針對各個元素執行表達式,並返回結果。

foreach(..., .combine, .init, .final=NULL, .inorder=TRUE,
       .multicombine=FALSE,
       .maxcombine=if (.multicombine) 100 else 2,
       .errorhandling=c('stop', 'remove', 'pass'),
       .packages=NULL, .export=NULL, .noexport=NULL,
       .verbose=FALSE)

真正執行foreach循環,需要使用%do%或者%dopar%運算符

> i_square <- foreach(i=1:5) %do% i^2
> i_square
[[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 9

[[4]]
[1] 16

[[5]]
[1] 25

%do%運算符順序執行表達式,而%dopar%運算符可以用來並行執行表達式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM