我觉得我已经接受过训练,通过在我想要否定的逻辑条件周围放置一个支架来否定。
但是我最近看到的东西在我没想到的时候没有括号。
x <- "a"
y <- letters[1:3]
!(x %in% y) # Negate is x in y? I've been trained to do this. FALSE
x %in% y # Is x in y? TRUE
!x %in% y # Negate x is it in y? FALSE
最后一个结果返回FALSE,但不是说negate x and match y
而不是匹配y中的x并且否定。
这种语法有什么变化,突然之间没有必要为了否定而输入括号吗?
!(x %in% y) # FALSE
!x %in% y # FALSE, but feels like it's correct by coincidence.
答案 0 :(得分:3)
代码具有操作顺序,就像常规代数一样。在R中,%operator%
运算符被列为具有更高优先级,因此基本上在!
否定运算符之前进行求值。以下是参考:https://stat.ethz.ch/R-manual/R-devel/library/base/html/Syntax.html
因此,根据R语法评估/解析规则的规律,! a %in% b
与!(a %in% b)
相同,即使它看起来不同。