R語言-迴圈repeat,while,for,foreach,iter,next,break
阿新 • • 發佈:2019-01-08
R中有三種不同的迴圈結構:
1.repeat結構
它只是簡單的重複同一個表示式:repeat expression,如果要跳出迴圈,可以使用break命令,若要跳至迴圈中的下一輪迭代,需要使用next命令;如果在迴圈中不包括break命令,R程式碼將會是一個無限迴圈。
因此,常用的結構如下:
123456 | repeat { expression if (condition){ break } } |
舉例如下:
12345678910 | # 求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結構:在某個條件為真時,重複某一特定的表示式
1 | while (condition) expression |
舉例如下:
12345 | > i <- 1 > sum_100 <- 0 > while (i<=100){sum_100=sum_100+i;i=i+1} > print (sum_100) [1] 5050 |
3. for迴圈結構可以遍歷向量或者列表中的每個元素:
1 | for (var in list) expression |
舉例如下:
123 | > 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可以實現迭代器功能。迭代器可以返回向量、陣列、資料框或者其他物件的元素,當然也可以返回函式。
1234 | iter (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] 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能夠迴圈遍歷某個物件(向量、矩陣、資料框或者迭代器)中的多個元素,針對各個元素執行表示式,並返回結果。
123456 | 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%運算子