为什么 TRUE == “TRUE” 在 R 中是 TRUE?

Why TRUE == "TRUE" is TRUE in R?

提问人:Mahdi 提问时间:2/18/2013 最后编辑:HenrikMahdi 更新时间:7/21/2021 访问量:4652

问:

  1. 为什么在 R 中?TRUE == "TRUE"TRUE
  2. R 中是否有任何等价物?===

更新:

这些都回来了:FALSE

TRUE == "True"
TRUE == "true"
TRUE == "T"

唯一的值是 。TRUETRUE == "TRUE"

如果检查一切正常。identical()

第二次更新:

我所说的运算符是指检查变量ValueData Type 的过程。在本例中,我假设运算符只会比较变量的,而不会比较它们的数据类型=====

r 比较布尔 逻辑

评论

0赞 agstudy 2/18/2013
是javascript运算符吗?严格的相等比较算法?===
0赞 Mahdi 2/18/2013
@agstudy我想在许多 C 驱动的语法语言中,我们同时使用这个运算符进行值和数据类型检查。我不确定其他语言......
1赞 Bernd Elkemann 2/18/2013
TRUE==1 和 TRUE==1.0 和 TRUE==1.0000000000000001(和 0.99999999999999999)也是 true。一般来说,所有足够接近 1.0 的东西都可以IEEE754舍入到它。
0赞 Simon Bergot 2/18/2013
@Mahdi大多数 C 驱动语言都有静态类型,因此此运算符不会对它们进行感知。另请注意,ruby 有这个运算符。所以它主要用于具有动态类型和默认类型强制的语言中,用于值比较。
0赞 Arun 2/19/2013
可能重复 stackoverflow.com/questions/5681166/...

答:

62赞 plannapus 2/18/2013 #1

根据帮助文件:?`==`

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

所以被强迫(即),因此是平等的。TRUE"TRUE"as.character(TRUE)

其他语言中的运算符(即两个对象是否相等且类型相同)的等价物是函数:===identical

identical(TRUE, "TRUE")
[1] FALSE

评论

0赞 Mahdi 2/18/2013
感谢您的回答,工作正常,但还是.有什么想法吗?identicalTRUE == "T"TRUE == "true"FALSE
3赞 plannapus 2/18/2013
好的,我必须编辑我的答案,因为我是倒着想的:实际上强制到一个通用类型,优先级顺序是字符、复杂、数字、整数、逻辑和原始。因此,被胁迫为“真实”实际上是真的,而不是相反,我的坏。==
1赞 agstudy 2/18/2013
@plannapus也许你应该治疗 NaN 案例......我不认为 Same 像 === 那样对待 NaN,例如:NaN===NaN is False bu identical(NaN,NaN) is TRUE。
1赞 plannapus 2/18/2013
@agstudy你可以模拟给出 FALSE 和参数 : gives TRUE but gives FALSE(但是只是测试仍然给出 TRUE)。NaN===NaNsingle.NA=FALSEidenticalidentical(log(-1), 0*Inf)identical(log(-1), 0*Inf, single.NA=FALSE)identical(NaN, NaN, single.NA=FALSE)
2赞 IRTFM 2/18/2013
在 R 中,没有任何东西是 “==” 或 ,甚至是他们自己。NANaN
12赞 IRTFM 2/18/2013 #2

TRUE 和 FALSE 是 R 中的保留字。当他说任何非零值为 TRUE 时,我认为 eznme 是正确的(在他编辑之前),因为计算结果为 FALSE。(这在解释为什么计算结果为 TRUE 时是正确的,但它不能解释TRUE == "A"TRUE == 1TRUE == 7

plannapus 给出的解释脱离了描述 的行为的上下文。它更接近“真相”,因为正是运算符对 TRUE 的隐含强制创造了这个结果。尽管最初为 TRUE 和 FALSE 指定了 TRUE 和 FALSE 值,但可以将它们重新分配给其他值或类型。as.logical==TF

> TRUE == as.logical( c("TRUE", "T", "true", "True") )
[1] TRUE TRUE TRUE TRUE

>  TRUE == 7
[1] FALSE
> TRUE == as.logical(7)
[1] TRUE
>  TRUE == as.logical("A")
[1] NA

(我之前错误地写道,TRUE == “TRUE” 引起的强制是合乎逻辑的;它实际上是通过 as.character(TRUE) 返回 “TRUE”。

评论

0赞 plannapus 2/18/2013
前面的引用确实是因为我认为这是强制到一个常见的类型,我只是假设了一个错误的优先级顺序。请参阅我的编辑进行更正。as.logical==
0赞 Bernd Elkemann 2/18/2013
since TRUE == "A" evaluates to FALSE:因为它们是不同的价值观!
0赞 IRTFM 2/18/2013
但 TRUE 和“TRUE”也是不同的值,...事实上,它们甚至是不同的模式。
3赞 Bernd Elkemann 2/18/2013 #3

除了

TRUE == “真”

这些也是正确的:

  • 真==1
  • 真==1.0
  • TRUE==1.00000000000000001
  • 真==0.9999999999999999999 等等,一般来说,所有值都足够接近 1.0,可以IEEE754舍入到它。

但更有趣的是 if() 检查:它检查;事实上,这情节!non-false

if(4.0) plot(1) 

我认为唯一不触发的值是 0、F、FALSE 和“FALSE”,它们似乎被定义为正好 0。if()

评论

2赞 IRTFM 2/18/2013
?"如果“明确指出它的论点是被迫合乎逻辑的。
0赞 Bernd Elkemann 2/18/2013
一切非假的东西都会被强迫为真。datatype-width 在这里并不有趣,有趣的是注意哪些原始值映射到 true,哪些映射到 false。
2赞 IRTFM 2/18/2013
并不是真的,所有非 FALSE 都会被强制为 TRUE。NA 将抛出错误。