什么时候需要在if语句周围加上括号来控制R中公式的顺序?

Ber*_*end 12 if-statement r sequence

我正在尝试将数字除以两个if语句的结果之和。由于某种原因,R在完成第一个if语句后忽略两个if语句的括号,仅对第一个if语句进行除法。在第一个if语句周围加上括号时,该公式将按预期工作。问题是:为什么呢?

用ifelse(y == 2,4,1)替换if语句可以解决该问题,以及多余的括号。我很好奇为什么第一次测试会给我出乎意料的结果。

x <- 1
y <- 2 
z <- 4

test1 <- z/(if(y==2){4}else{1}+if(x==1){4}else{1})
> print(test1)

[1] 1

test2 <- z/((if(y==2){4}else{1})+if(x==1){4}else{1})
> print(test2)

[1] 0.5
Run Code Online (Sandbox Code Playgroud)

我希望test1和test2的结果均为0.5

Hug*_*ugh 7

一个好问题。从R语言定义

R中的计算由顺序评估语句组成。诸如x <-1:10或mean(y)之类的语句可以用分号或换行符分隔

此外,在 if

if / else语句有条件地求值两个语句。有一个条件被评估,如果该值为TRUE,则评估第一条语句;否则将评估第二条语句。if / else语句返回所选择的语句的值作为其值。正式语法是

if ( statement1 )
    statement2
else
    statement3
Run Code Online (Sandbox Code Playgroud)

您遇到的问题{1}+if(x==1){4}else{1}是有效的声明,因此R将其解释为statement3。换句话说,从else,直到语句为FALSE 时,才遇到(在块内)直到换行符或分号为止的所有内容if

通常情况下,

if (y == 2) {
  4
} else {
  1
}
Run Code Online (Sandbox Code Playgroud)

我们了解到,在最后一个花括号之后,if语句已完成,但它是换行符(而不是右花括号)表示表达式的结尾。例如,这不会创建a

if (y == 2) {
  4
} else {
  1
} -> a
Run Code Online (Sandbox Code Playgroud)