我正在努力理解一些R的行為,當if/else陳述句被隱含地用在一個函式中,而不是明確地指定if/else陳述句中包含的運算式。
這個玩具函式如我所期望的那樣作業,當收到TRUE時列印"x是TRUE",當收到FALSE時列印"x是FALSE"。
f1 < - function(x){
if (x)
print("x is TRUE")
else
print("x is FALSE")
}
> f1(TRUE)
[1] "x 是 TRUE"
> f1(FALSE)
[1] "x是FALSE"。
>
然而,如果我給它添加一個隱含的、嵌套的if陳述句,那么它就不再像我所期望的那樣表現。下面的函式被期望表現得和上面的函式完全一樣,但是當交給它一個FALSE時,它卻什么都不列印。
f1 < - function(x){
if (x)
if(TRUE)
print("x is TRUE")
else
print("x is FALSE")
}
> f1(TRUE)
[1] "x 是 TRUE"
> f1(FALSE) # No output?
>
最后,如果我添加括號來指定安排,并使if/else明確,它的功能又達到了預期:
f1 < - function(x){
if (x){
if (TRUE)
print("x is TRUE")
} else {>
print("x是FALSE")
}
}
> f1(TRUE)
[1] "x 是 TRUE"
> f1(FALSE)
[1] "x是FALSE"。
>
在網上搜索這個問題的時候,我看到了兩個隱約相關的答案。其中一個討論了括號不起作用的問題,但沒有討論如果完全缺少括號的不同輸出,另一個討論了著名的"'else'中的意外'else'錯誤。從他們那里,我了解到R可能將if陳述句解釋為它自己的行,但我不明白為什么在函式內沒有意外的else拋出錯誤,也沒有任何其他輸出。
誰能幫助我理解R的控制流邏輯嗎?
uj5u.com熱心網友回復:
像許多語言一樣,R很貪婪地將else附加到最近的if。 所以你的代碼沒有按照R的閱讀方式縮進,即
if (x)
if(TRUE)
print("x is TRUE")
else
print("x is FALSE")
if(TRUE)陳述句得到else,由于TRUE是TRUE,所以else從未被執行。
R中的一個奇怪的現象是,如果你直接在控制臺中輸入東西,而不是在一個函式中輸入,那么事情的表現是不同的。 那么它就會貪婪地完成陳述句,所以我上面寫的將是一個語法錯誤:
if (x)
if(TRUE)
print("x is TRUE")
是一個完整的陳述句,所以它將被執行。 然后當你輸入else時,你會得到一個錯誤,因為else不允許在陳述句中開始。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314511.html
標籤:
