From dmurdoch at pair.com  Sat Sep 13 09:42:13 2003
From: dmurdoch at pair.com (Duncan Murdoch)
Date: Sat Sep 13 14:41:33 2003
Subject: [Rd] bug or feature? (PR#4150)
In-Reply-To: <200309131137.h8DBbSJH021576@pubhealth.ku.dk>
References: <200309131137.h8DBbSJH021576@pubhealth.ku.dk>
Message-ID: <cm36mvs5on6srf0g2kec10a8ol1kgidff1@4ax.com>

On Sat, 13 Sep 2003 13:37:28 +0200 (MET DST), you wrote:

>Full_Name: Axel Benz
>Version: 1.7.1
>OS: Windows
>Submission from: (NULL) (137.251.33.43)
>
>
>This feature seems to be a basic bug:
>
>> 1=="1"
>[1] TRUE
>> as.numeric(1)=="1"
>[1] TRUE
>> as.numeric(1)==as.character("1")
>[1] TRUE
>
>isn't it necessary to distinguish beteen numbers and characters??

No, the general rule in R is that operators try to coerce their
arguments into a suitable type for the operation.  In this case,
because one arg is character, the other one is coerced to character
too.  It doesn't matter that you forced the type using as.numeric or
as.character; the operator is going to force them both to comparable
types.

For example,

> as.character(pi)
[1] "3.14159265358979"
> pi == "3.14159265358979"
[1] TRUE
> pi == 3.14159265358979
[1] FALSE

In the last case, they were already comparable, so no forcing was
done.  Since the internal value of pi actually carries more than 14
decimal places of precision, they don't compare equal as numbers, even
though the do compare equal when converted to character.

If you want to distinguish numbers and characters, use mode(1) ==
mode("1").

Duncan Murdoch


[Rd] bug or feature? (PR#4150)
Duncan Murdoch