R 中的隐式与显式 if/else,括号更改输出?
Implicit vs explicit if/else in R, brackets change output?
当 if/else 语句在函数中隐式使用而不是显式指定 if/else 语句中包含的表达式时,我很难理解某些 R 行为。
这个玩具功能如我所料,在收到 TRUE
时打印 "x is TRUE"
并在收到 FALSE
时打印 "x is FALSE"
。
f1 <- function(x){
if (x)
print("x is TRUE")
else
print("x is FALSE")
}
> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE)
[1] "x is FALSE"
>
但是,如果我向它添加一个隐式的嵌套 if 语句,它就会停止按我预期的方式运行。下面的函数应该与上面的函数完全一样,但是当传递 FALSE
.
时它什么也不打印
f1 <- function(x){
if (x)
if(TRUE)
print("x is TRUE")
else
print("x is FALSE")
}
> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE) # No output?
>
最后,如果我添加括号来指定排列并使 if/else 显式化,它将再次按预期运行:
f1 <- function(x){
if (x){
if (TRUE)
print("x is TRUE")
} else {
print("x is FALSE")
}
}
> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE)
[1] "x is FALSE"
>
在网上搜索这个问题时,我看到了两个隐约相关的答案。一个讨论an issue with brackets not working but doesn't discuss different output if the brackets are missing entirely, and the other discusses the famous "Unexpected 'else' in 'else' error。从他们那里,我开始明白 R 可能将 if
语句解释为它自己的行,但我不明白为什么函数或任何意外的 else
没有抛出错误其他输出。
有人可以帮我理解 R 的控制流逻辑吗?
像许多语言一样,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
不允许开始一个语句。
当 if/else 语句在函数中隐式使用而不是显式指定 if/else 语句中包含的表达式时,我很难理解某些 R 行为。
这个玩具功能如我所料,在收到 TRUE
时打印 "x is TRUE"
并在收到 FALSE
时打印 "x is FALSE"
。
f1 <- function(x){
if (x)
print("x is TRUE")
else
print("x is FALSE")
}
> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE)
[1] "x is FALSE"
>
但是,如果我向它添加一个隐式的嵌套 if 语句,它就会停止按我预期的方式运行。下面的函数应该与上面的函数完全一样,但是当传递 FALSE
.
f1 <- function(x){
if (x)
if(TRUE)
print("x is TRUE")
else
print("x is FALSE")
}
> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE) # No output?
>
最后,如果我添加括号来指定排列并使 if/else 显式化,它将再次按预期运行:
f1 <- function(x){
if (x){
if (TRUE)
print("x is TRUE")
} else {
print("x is FALSE")
}
}
> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE)
[1] "x is FALSE"
>
在网上搜索这个问题时,我看到了两个隐约相关的答案。一个讨论an issue with brackets not working but doesn't discuss different output if the brackets are missing entirely, and the other discusses the famous "Unexpected 'else' in 'else' error。从他们那里,我开始明白 R 可能将 if
语句解释为它自己的行,但我不明白为什么函数或任何意外的 else
没有抛出错误其他输出。
有人可以帮我理解 R 的控制流逻辑吗?
像许多语言一样,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
不允许开始一个语句。