1. 程式人生 > >R語言-迴圈repeat,while,for,foreach,iter,next,break

R語言-迴圈repeat,while,for,foreach,iter,next,break

R中有三種不同的迴圈結構:

1.repeat結構

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

因此,常用的結構如下:

123456repeat {expressionif(condition){break}}

舉例如下:

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

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

1while(condition) expression

舉例如下:

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

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

1for(var in list) expression

舉例如下:

123for(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可以實現迭代器功能。迭代器可以返回向量、陣列、資料框或者其他物件的元素,當然也可以返回函式。

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

舉例如下:

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

(2)foreach迴圈:該功能通過R語言擴充套件包foreach實現,foreach能夠迴圈遍歷某個物件(向量、矩陣、資料框或者迭代器)中的多個元素,針對各個元素執行表示式,並返回結果。

123456foreach(..., .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%運算子