为啥 TRUE == "TRUE" 在 R 中为 TRUE?

Posted

技术标签:

【中文标题】为啥 TRUE == "TRUE" 在 R 中为 TRUE?【英文标题】:Why TRUE == "TRUE" is TRUE in R?为什么 TRUE == "TRUE" 在 R 中为 TRUE? 【发布时间】:2013-02-02 15:08:04 【问题描述】:
    为什么 TRUE == "TRUE" 在 R 中是 TRUE? R 中的=== 是否有任何等价物?

更新:

这些都返回FALSE:

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

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

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

第二次更新:

=== 运算符是指检查变量数据类型的过程。在这种情况下,我假设== 运算符只会比较变量的,而不是它们的数据类型

【问题讨论】:

===javascript 运算符吗? The Strict Equality Comparison Algorithm? @agstudy 我猜在许多 C 驱动的语法语言中,我们都有这个运算符同时用于值和数据类型检查。我不确定其他语言... TRUE==1 和 TRUE==1.0 和 TRUE==1.0000000000000001(和 0.99999999999999999)也是正确的。一般来说,所有足够接近 1.0 的东西都可以被 IEEE754 四舍五入。 @Mahdi 大多数 C 驱动语言都有静态类型,所以这个运算符对它们没有意义。还要注意 ruby​​ 有这个操作符。所以它主要用于具有动态类型和默认类型强制的语言中进行值比较。 @Simon 谢谢你的解释,你是对的。 :) 【参考方案1】:

根据帮助文件?`==`

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

所以TRUE 被强制转换为"TRUE"(即as.character(TRUE)),因此相等。

在其他语言中,运算符=== 的等效项(即两个对象是否相等且类型相同)将是函数identical

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

【讨论】:

感谢您的回答,identical 工作正常,但TRUE == "T"TRUE == "true" 仍然是FALSE。有什么想法吗? 好的,我必须编辑我的答案,因为我是向后考虑的:实际上== 强制转换为常见类型,优先顺序是字符、复杂、数字、整数、逻辑和原始。所以实际上是 TRUE 被强制为“TRUE”,而不是相反,我的错。 @plannapus 也许你应该对待 NaN 的情况..我不认为相同的对待 NaN 像 ===,例如: NaN===NaN 是 False bu 相同(NaN,NaN)是 TRUE . 在 R 中,NANaN 都不是“==”,甚至是它们自己。 @agstudy 您可以模拟NaN===NaNidentical 中使用single.NA=FALSE 给出FALSE:identical(log(-1), 0*Inf) 给出TRUE 但identical(log(-1), 0*Inf, single.NA=FALSE) 给出FALSE(但仅测试identical(NaN, NaN, single.NA=FALSE) 仍然给出TRUE) .【参考方案2】:

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

plannapus 给出的解释脱离了描述as.logical 行为的上下文。它更接近“真相”,因为它是由 == 运算符对字符的 TRUE 的隐式强制创建此结果。虽然 TF 最初被赋予 TRUE 和 FALSE 值,但它们可以重新分配给其他值或类型。

> 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"。)

【讨论】:

前面的引用确实是针对as.logical 的,因为我认为== 是强制转换为常见类型,我只是假设优先顺序错误。请参阅我的修改以进行更正。 since TRUE == "A" evaluates to FALSE :因为它们是不同的值! 但是 TRUE 和 "TRUE" 也是不同的值,...实际上它们甚至是不同的模式。【参考方案3】:

除了

真 == “真”

这些也是真的:

真==1 真==1.0 TRUE==1.0000000000000001 TRUE==0.99999999999999999 等等,一般来说,所有接近 1.0 的值也可以通过 IEEE754 舍入到它。

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

if(4.0) plot(1) 

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

【讨论】:

?"if" 明确指出它的论点被强制为逻辑。 所有非假的都将被强制为真。 datatype-width 在这里并不有趣,有趣的是要注意哪些原始值映射为 true,哪些映射为 false。 并非真的所有非 FALSE 都会被强制为 TRUE。 NA 会抛出错误。

以上是关于为啥 TRUE == "TRUE" 在 R 中为 TRUE?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 draggable="true" 拖动时不显示 div 的内容?

为啥 "abcd".StartsWith("") 返回 true?

为啥 IsNumeric("1.23D45") 返回 True?

为啥 <h:inputText required="true"> 允许空格?

Python:为啥 ("hello" is "hello") 评估为 True? [复制]

Python:为啥 ("hello" is "hello") 评估为 True? [复制]