为啥 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 中,NA
或 NaN
都不是“==”,甚至是它们自己。
@agstudy 您可以模拟NaN===NaN
在identical
中使用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 的隐式强制创建此结果。虽然 T
和 F
最初被赋予 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"> 允许空格?