【问题标题】:Why does as.numeric(1) == (3 | 4) evaluate to TRUE?为什么 as.numeric(1) == (3 | 4) 评估为 TRUE?
【发布时间】:2018-06-04 08:36:31
【问题描述】:

我想使用h == 1 | 2 进行简单比较,其中h 可以是1 到4 之间的整数。令我惊讶的是,它不起作用。

我可以理解为什么

1 == 2 | 4

是的

也许是为什么

1 == (2 | 4)

是的

但是为什么以一切合理和理智的名义呢

as.numeric(1) == (2 | 4)

1L == (2 | 4)

3 == 2 | 4

评估为

是的

???

如何让 R 告诉我是否1 is equal to 2 or 4 并且答案是FALSE

【问题讨论】:

  • 你应该使用1 %in% c(2,4)
  • 您希望2|4 评估为什么?
  • @HongOoi 我希望像 Julia 或 JavaScript 这样的行为,当然不是从数字到逻辑的强制......
  • 请回答问题。 2|4 的计算结果为 TRUE,即使 ti 是一种毫无意义的陈述。 @dww 更符合您的要求。仅在命令行中测试 2|4 可能会帮助您理解符号。
  • 顺便说一句,在 Julia 和 python 中,1 == 2|4false,但不是因为您认为的原因:| 是按位或运算符,所以 2|4 的计算结果为 6 .. . 本身并不值得一个答案,但也许值得某人包括在现有答案中......

标签: r


【解决方案1】:
1 == 2 | 4

Operator precedence 告诉我们它等同于(1 == 2) | 4

1 == 2FALSE,4 被强制为逻辑(因为| 是逻辑运算符),as.logical(4)TRUE,所以你有FALSE | TRUE,那就是TRUE

确实coercion rules for logical operators (?Logic) 告诉我们:

数字和复数向量将被强制转换为逻辑值,其中 零为假,所有非零值为真。


3 == 2 | 4

同样的事情


1 == (2 | 4)

2 | 4 将被强制转换为TRUE | TRUE,即TRUE。然后将1 == TRUE 强制转换为1 == 1,即TRUE

确实coercion rules for comparison operators (?Comparison) 告诉我们:

如果两个参数是不同类型的原子向量,一个是 强制为另一个类型,(递减)优先顺序 是字符,复杂,数字,整数,逻辑和原始。


as.numeric(1) == (2 | 4)

同样的事情


1L == (2 | 4)

还是一样


1 等于 2 或 4

其实是(1等于2)或者(1等于4),也就是:

(1==2)|(1==4)

这是

FALSE | FALSE

这是FALSE

【讨论】:

  • 啊,强制...谢谢,我没有意识到as.logical(4) 会是TRUE。我认为这根本不合理。
  • 在大多数语言中都是这样的,0 什么都不是,1 或 4 或 100 是什么,所以它是TRUE,它在很多情况下都很有用。
  • 3 == TRUE 为假,而3 == 2 | 4 为真
  • JavaScript、Julia 和 Python 都没有这样的行为,我知道的也不多。无论如何,谢谢你的详细解释。
  • bool(4) 是真的,所以python 确实 的行为方式相同。 bool(0) 是假的,bool(-1) 也是真的
【解决方案2】:

运行2|4 计算结果为TRUE。这就是为什么在比较1 == TRUE 时会得到TRUE。您要评估的是(1 == 2) | (1 == 4),这会产生所需的FALSE

【讨论】:

  • 查看其他答案,您的运算符优先级错误
  • 谢谢,我会接受更详细的回答,但我也很感激你的回答!
【解决方案3】:

将为您第一句话中的隐含问题提供预期答案的代码是:

1 %in% 2:4
[1] FALSE

h=1
h %in% 1:2
[1] TRUE

“==”运算符不会从逻辑连词中隐式生成范围(或备选向量)。它被认为是“比较”运算符并且是“通用的”,这意味着不同数据类型的方法可能不同。它们也是矢量化的(使用有效的隐式回收规则),因此可能会返回许多值:

(1:2) == (1:4)
[1]  TRUE  TRUE FALSE FALSE

并且应用于值1as.numeric() 函数将完全返回输入。

进一步评论:由于您尝试使用“==”实际上是作为隐式集合操作,您可能需要查看?intersect 的帮助页面。还有一些包可以处理更复杂的集合函数。

R 的强制转换可以在逻辑和数字之间来回切换,具体取决于函数的定义方式:

sum( letters[1:10] %in% letters)
[1] 10

sum( letters[1:10] == letters)
[1] 10
Warning message:
In letters[1:10] == letters :
  longer object length is not a multiple of shorter object length

【讨论】:

  • 我在寻找 c(2, 4) 而不是 2:4,但是谢谢,这也很有用。
  • 同样的区别,真的。 1 %in% c(2,) 同样是 FALSE。 Python 的or 函数以按位二进制方式处理数值,因此2 or 3 返回2。我会反驳任何声称这比 R 返回的更“直观”的说法。两者在完全相同的设置中都很有用......它们被花时间阅读运算符和数据类型定义的人使用。
猜你喜欢
  • 2012-03-06
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 2014-06-17
  • 2015-03-15
  • 2013-11-11
  • 1970-01-01
相关资源
最近更新 更多