R語言初級(jí)教程(22): 條件和循環(huán)語句

1. if…else 語句

決策是編程的重要組成部分侠驯。 可以在R中使用條件if...else語句來實(shí)現(xiàn)決策脐恩。

if 語句

其語法為:

if (test_expression) {
statement
}

如果test_expression的計(jì)算結(jié)果為TRUE镐侯,則大括號(hào)中的語句會(huì)被執(zhí)行;但是如果是FALSE驶冒,則大括號(hào)中的語句不會(huì)被執(zhí)行苟翻。

其流程圖為:

來看個(gè)例子:

x <- 5
if(x > 0) {
print("Positive number")
}

輸出為:

[1] "Positive number"

在這里,test_expression也可以是邏輯或數(shù)字向量骗污,但只會(huì)考慮第一個(gè)元素崇猫,并給出警告。

如果是數(shù)字向量需忿,其中只有0表示為FALSE邓尤,其余都表示為TRUE。看個(gè)例子:

x <- c(-1, 0)
if(x) {
    print("Non zero")
}

輸出為:

[1] "Non zero"
Warning message:
In if (x) { : 條件的長度大于一汞扎,因此只能用其第一元素

if...else 語句

其語法為:

if (test_expression) {
statement1
} else {
statement2
}

else部分是可選的季稳,只有在test_expression的結(jié)果為FALSE時(shí),else內(nèi)的語句才會(huì)被執(zhí)行澈魄。

注意景鼠,else必須與if語句后面的大括號(hào)位于同一行。

其流程圖為:

來看個(gè)例子:

x <- -5
if(x > 0){
print("Non-negative number")
} else {
print("Negative number")
}

輸出為:

[1] "Negative number"

上面的條件也可以如下寫成一行:

if(x > 0) print("Non-negative number") else print("Negative number")

R的這個(gè)特性允許我們像下面這樣編寫構(gòu)造:

> x <- -5
> y <- if(x > 0) 5 else 6
> y
[1] 6

if…else if...else 語句

其語法為:

if ( test_expression1) {
statement1
} else if ( test_expression2) {
statement2
} else if ( test_expression3) {
statement3
} else {
statement4
}

根據(jù)test_expressions痹扇,只會(huì)執(zhí)行其中的一條語句铛漓。

來看個(gè)例子:

x <- 0
if (x < 0) {
  print("Negative number")
} else if (x > 0) {
  print("Positive number")
} else {
  print("Zero")
}

輸出為:

[1] "Zero"

嵌套的 if...else 語句

我們可以在if ...else語句中包含另一個(gè)if ...else語句,稱為嵌套鲫构。

直接來看個(gè)例子:

x <- -2
if (x <= 0) {
  if(x==0){
    print("Zero")
  } else {
    print("Negative number")
  }
} else {
  print("Positive number")
}

輸出為:

[1] "Negative number"

2. ifelse 函數(shù)

向量是R語言的最基本單元浓恶。

R中的大多數(shù)函數(shù)都將向量作為輸入,并且輸出結(jié)果也是向量结笨。

函數(shù)的這種矢量化比將相同的函數(shù)分別應(yīng)用于向量的每個(gè)元素要快得多包晰。

與這個(gè)概念類似,在R中有一個(gè)if ...else語句的向量等價(jià)形式炕吸,即ifelse()函數(shù)伐憾。

其語法為:

ifelse(test_expression, x, y)

在這里,test_expression必須是邏輯向量(或可以強(qiáng)制為邏輯的對(duì)象)赫模。返回值也是一個(gè)向量树肃,且其長度與test_expression相同。

如果test_expression的對(duì)應(yīng)值為TRUE瀑罗,則返回的向量具有x的元素胸嘴,如果test_expression的對(duì)應(yīng)值為FALSE,則返回具有y的元素斩祭。

這就是說筛谚,如果test_expressionTRUE,結(jié)果的第i個(gè)元素將是x[i]停忿,否則它將取y[i]的值驾讲。

來看個(gè)例子:

> a <- c(5, 7, 2, 9)
> ifelse(a %% 2 == 0, "even", "odd")
[1] "odd"  "odd"  "even" "odd" 

在上面的示例中,test_expressiona %% 2 == 0席赂,它將給出向量(FALSE, FALSE, TRUE, FALSE)吮铭。

后面兩個(gè)參數(shù)將自動(dòng)擴(kuò)充到相同長度,變?yōu)椋?("even", "even", "even", "even")("odd", "odd", "odd", "odd")颅停。因此當(dāng)test_expression的對(duì)應(yīng)值為TRUE時(shí)谓晌,會(huì)取"even",否則取"odd"癞揉。

3. for 循環(huán)

for循環(huán)用于遍歷向量中的所有元素纸肉。

其語法為:

for (val in sequence)
{
statement
}

這里的sequence是一個(gè)向量溺欧,而val在循環(huán)過程中依次取sequence中每個(gè)值。在每次迭代中柏肪,都會(huì)執(zhí)行statement語句姐刁。

其流程圖為:

下面是一個(gè)計(jì)算向量中偶數(shù)個(gè)數(shù)的例子:

x <- c(2, 5, 3, 9, 8, 11, 6)
count <- 0
for (val in x) {
if(val %% 2 == 0)  count = count + 1
}
print(count)

輸出為:

[1] 3

在上面的示例中,由于向量x具有7個(gè)元素烦味,因此循環(huán)迭代了7次聂使。

在每次迭代中,valx對(duì)應(yīng)元素的值谬俄。

我們使用了一個(gè)計(jì)數(shù)器來計(jì)算x中偶數(shù)的個(gè)數(shù)柏靶。我們可以看到向量x包含3個(gè)偶數(shù)。

4. while 循環(huán)

在R中溃论,while循環(huán)用于循環(huán)直到特定條件不滿足為止屎蜓。

其語法為:

while (test_expression)
{
statement
}

如果test_expression的評(píng)估結(jié)果為TRUE,則進(jìn)入到循環(huán)的主體钥勋。

執(zhí)行主體中的語句炬转,執(zhí)行完后流程返回,再次評(píng)估test_expression笔诵。

重復(fù)此過程,直到test_expression評(píng)估結(jié)果為FALSE為止姑子,循環(huán)退出乎婿。

其流程圖為:

看個(gè)例子:

i <- 1
while (i < 6) {
print(i)
i = i + 1
}

輸出為:

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

在上面的示例中,i被初始化為1街佑。

在這里谢翎,test_expressioni < 6,由于1小于6沐旨,因此評(píng)估為TRUE森逮。因此,執(zhí)行了循環(huán)的主體打印i并遞增了i磁携。

i的增加很重要褒侧,這樣最終將滿足退出循環(huán)條件。否則谊迄,將導(dǎo)致無限循環(huán)闷供。

在下一次迭代中,i的值變?yōu)?code>2统诺,循環(huán)繼續(xù)進(jìn)行歪脏。

這將一直持續(xù)到i取值為6。條件6 < 6將給出FALSE粮呢,因此while循環(huán)到此結(jié)束婿失。

5. break 和 next 語句

在R中钞艇,可以使用breaknext語句更改正常的循環(huán)順序。

break 語句

break語句終止包含它的循環(huán)豪硅。 程序的控制權(quán)立即傳遞到循環(huán)體之外的語句哩照。

如果break語句在嵌套循環(huán)(另一個(gè)循環(huán)內(nèi)的循環(huán))內(nèi),則break將只會(huì)終止最里面的循環(huán)舟误。

其語法為:

if (test_expression) {
break
}

注意break語句也可以在if...else語句的else分支內(nèi)使用葡秒。

其流程圖為:

來看個(gè)例子:

x <- 1:5
for (val in x) {
if (val == 3){
break
}
print(val)
}

輸出為:

[1] 1
[1] 2

在此示例中,我們遍歷向量x嵌溢,該向量是從15的連續(xù)數(shù)字眯牧。

for循環(huán)中,如果當(dāng)前值等于3赖草,則停止循環(huán)学少。

從輸出結(jié)果可以看到,循環(huán)在遇到break語句時(shí)終止秧骑。

next 語句

next語句僅在當(dāng)前迭代時(shí)用于跳過循環(huán)內(nèi)的其余代碼版确。循環(huán)不會(huì)終止,會(huì)繼續(xù)進(jìn)行下一個(gè)迭代乎折。

其語法為:

if (test_condition) {
next
}

注意next語句也可以在if...else語句的else分支內(nèi)使用绒疗。

其流程圖為:

來看個(gè)例子:

x <- 1:5
for (val in x) {
if (val == 3){
next
}
print(val)
}

輸出為:

[1] 1
[1] 2
[1] 4
[1] 5

在上面的示例中,我們?cè)跅l件語句內(nèi)使用next語句來檢查該值是否等于3骂澄。

如果該值等于3吓蘑,則當(dāng)前迭代停止,不會(huì)執(zhí)行后面的代碼坟冲,因此當(dāng)前不會(huì)打印值磨镶,但循環(huán)會(huì)繼續(xù)進(jìn)行下一次迭代。

上述例子的結(jié)果反映了這種情況健提。

6. repeat 循環(huán)

repeat循環(huán)用于多次迭代代碼塊琳猫。

repeat循環(huán)中沒有條件檢查來退出循環(huán)。因此我們必須自己將一個(gè)條件顯式地放入循環(huán)體中私痹,并使用break語句退出循環(huán)脐嫂。如果不這樣做,將導(dǎo)致無限循環(huán)紊遵。

其語法為:

repeat {
statement
}

其流程圖為:

來看個(gè)例子:

x <- 1
repeat {
print(x)
x = x+1
if (x == 6) {
break
}
}

輸出為:

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

在上面的示例中雹锣,我們使用了一個(gè)條件來檢查并在x取值為6時(shí)退出循環(huán)。

因此癞蚕,我們?cè)谳敵鲋锌吹絻H打印15的值蕊爵。

今天的內(nèi)容就到此為止,介紹了R中的條件和循環(huán)語句桦山,希望對(duì)大家有點(diǎn)幫助攒射。


感謝您的閱讀醋旦!想了解更多有關(guān)技巧,請(qǐng)關(guān)注我的微信公眾號(hào)“R語言和Python學(xué)堂”会放,我將定期更新相關(guān)文章饲齐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咧最,隨后出現(xiàn)的幾起案子捂人,更是在濱河造成了極大的恐慌,老刑警劉巖矢沿,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滥搭,死亡現(xiàn)場離奇詭異,居然都是意外死亡捣鲸,警方通過查閱死者的電腦和手機(jī)瑟匆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栽惶,“玉大人愁溜,你說我怎么就攤上這事⊥獬В” “怎么了冕象?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汁蝶。 經(jīng)常有香客問我渐扮,道長,這世上最難降的妖魔是什么穿仪? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任席爽,我火速辦了婚禮意荤,結(jié)果婚禮上啊片,老公的妹妹穿的比我還像新娘。我一直安慰自己玖像,他們只是感情好紫谷,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捐寥,像睡著了一般笤昨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上握恳,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天瞒窒,我揣著相機(jī)與錄音,去河邊找鬼乡洼。 笑死崇裁,一個(gè)胖子當(dāng)著我的面吹牛匕坯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拔稳,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼葛峻,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了巴比?” 一聲冷哼從身側(cè)響起格嘁,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤板甘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體植旧,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年野蝇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谁尸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稼病,死狀恐怖选侨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情然走,我是刑警寧澤援制,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站芍瑞,受9級(jí)特大地震影響晨仑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拆檬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一洪己、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竟贯,春花似錦答捕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至持际,卻和暖如春沃琅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜘欲。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工益眉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姥份。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓郭脂,卻偏偏與公主長得像空繁,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朱庆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 作者的序言 朋友們盛泡,棄療系列4出來啦,作者還并沒有放棄娱颊,感覺自己萌萌噠傲诵,233。 語句 js程序其實(shí)就是一系列可執(zhí)...
    zhaolion閱讀 1,742評(píng)論 0 8
  • 前端07班 王語句JavaScript程序的執(zhí)行單位為行(line)箱硕,也就是一行一行地執(zhí)行拴竹。一般情況下,每一行就是...
    ea203453e188閱讀 880評(píng)論 0 4
  • 一、條件語句 條件語句通過設(shè)定的一個(gè)或多個(gè)條件來執(zhí)行程序惠昔,在條件為真時(shí)執(zhí)行指定的語句幕与,在條件為 false 時(shí)執(zhí)行...
    Albert_Li99閱讀 2,556評(píng)論 0 2
  • 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一行一行地執(zhí)行镇防。一般情況下啦鸣,每一行就是一個(gè)語句。 ...
    米塔塔閱讀 452評(píng)論 1 10
  • 一.分支結(jié)構(gòu) 1.if語句 if語句會(huì)與其后的第一條語句或代碼塊結(jié)合来氧,且只有當(dāng)判斷條件為true時(shí)才執(zhí)行語句或代碼...
    游戲原畫設(shè)計(jì)閱讀 371評(píng)論 0 0