求和的行为!is.na()结果

Xac*_*iel 14 r operator-precedence logical-operators na

为什么第一行返回TRUE,第三行返回1?我希望两行都返回1.第三行中额外两个括号的确切含义是什么?

!is.na(5) + !is.na(NA)
# TRUE
(!is.na(5)) + (!is.na(NA))
# 1
Run Code Online (Sandbox Code Playgroud)

编辑:应多次检查这些.最初的问题是!is.na(),并认为它复制了is.na().但它没有:)

Kon*_*lph 21

! 在R中有一个奇怪的,反直觉的优先权.

你的第一个代码相当于

!(is.na(5) + !is.na(NA))
Run Code Online (Sandbox Code Playgroud)

也就是说,!优先级低于+.

  • 只是去展示:无论使用哪种语言,都要使用一些额外的括号来避免含糊不清. (6认同)
  • 对于Lispers:`codetools :: showTree(quote(!is.na(5)+!is.na(NA))) (4认同)
  • +1 - 这意味着你可以获得奇怪的结果,如:`!TRUE + FALSE等于FALSE`和'FALSE +!TRUE等于0`这会伤害我的大脑. (2认同)
  • De gustibus non disputandam.一个体面的编辑器将提供颜色或其他突出显示以匹配大括号.我理解可读性问题,所以我不是建议大量的支架矫枉过正.另一点:代码经常最终被从一种语言移植到另一种语言.只要存在非标准或非直观的优先级,括号就会有很大帮助. (2认同)