Why TRUE == “TRUE” is TRUE in R?

 ̄綄美尐妖づ 提交于 2019-11-26 13:47:42

问题


  1. Why TRUE == "TRUE" is TRUE in R?
  2. Is there any equivalent for === in R?

Update:

These are all returning FALSE:

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

The only TRUE value is TRUE == "TRUE".

In case of checking with identical() everything works fine.

Second Update:

By === operator I meant the process of checking the Value and the Data Type of a variable. In this case I assumed that the == operator will only compare the Values of variables, not their Data Type as well.


回答1:


According to the help file ?`==`:

If the two arguments are atomic vectors of different types, one is coerced to the type of the other, the (decreasing) order of precedence being character, complex, numeric, integer, logical and raw.

So TRUE is coerced to "TRUE" (i. e. as.character(TRUE)), hence the equality.

The equivalent of operator === (i. e. are the two objects equal and of the same type) would be function identical:

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



回答2:


TRUE and FALSE are reserved words in R. I don't think eznme was correct (before his edit) when he said any non-zero value was TRUE, since TRUE == "A" evaluates to FALSE. (That would have been correct in explaining why TRUE == 1 evaluates to TRUE, but it would not explain the result for TRUE == 7

The explanation given by plannapus was taken out of the context of describing the behavior of as.logical. It is closer to the "truth", because it is the implicit coercion of TRUE to character by the == operator that creates this result. Although T and F are initially given the values of TRUE and FALSE, they can be reassigned to other values or types.

> 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

(I earlier incorrectly wrote that the coercion induced by TRUE == "TRUE" was to logical; it's actually via as.character(TRUE) returning "TRUE".)




回答3:


In addition to

TRUE == "TRUE"

these are also true:

  • TRUE==1
  • TRUE==1.0
  • TRUE==1.0000000000000001
  • TRUE==0.99999999999999999 etc, in general also all values close enough to 1.0 to be IEEE754-rounded to it.

But what is more interesing is what if() checks: it checks non-false; in fact this plots!:

if(4.0) plot(1) 

I think the only values that dont trigger if() are 0, F, FALSE and "FALSE" they seem defined as exactly 0.



来源:https://stackoverflow.com/questions/14932015/why-true-true-is-true-in-r

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!