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%運算符可以用來並行執行表達式。