[R] Is k equivalent to k:k ?

Marc Schwartz MSchwartz at MedAnalytics.com
Mon Aug 2 17:09:52 CEST 2004


On Mon, 2004-08-02 at 09:46, Georgi Boshnakov wrote:
> Hi,
> 
> I wonder if the following (apparent) inconsistency is a bug or
> feature. 
> Since scalars are simply vectors of length one I would think that 
>       a      and 
>       a:a 
> produce the same result. For example,
> 
> > identical(4.01,4.01:4.01)
> [1] TRUE
> 
> However,
> 
> identical(4,4:4)
> [1] FALSE
> 
> and
> 
> > identical(4.0,4.0:4.0)
> [1] FALSE
> 
> A closer look reveals that the colon operator produces objects of
> different class, e.g.
> 
> > class(4)
> [1] "numeric"
> > class(4.0)
> [1] "numeric"
> 
> but
> 
> > class(4:4)
> [1] "integer"
> > class(4.0:4.0)
> [1] "integer"
> 
> 
> Georgi Boshnakov

The ":" operator is the functional equivalent of "seq(from=a, to=b)".

Note that the help for seq() indicates the following for the return
value:

"The result is of mode "integer" if from is (numerically equal to an)
integer and by is not specified."

Thus, when using the ":" operator, you get integers as the returned
value(s), which is what is happening in your final pair of examples.


If you look at the final example under ?identical, you will see:

identical(1, as.integer(1)) ## FALSE, stored as different types

This is because the first 1 is a double by default.


Thus, in the case of:

identical(4, 4:4)

the first 4 is of type double, while the 4:4 is of type single. Thus the
result is FALSE.

Now, on the other hand, try:

> typeof(seq(4, 4, by = 1))
[1] "double"

You see that the result of the sequence is of type double. Hence:

> identical(4, seq(4, 4, by = 1))
[1] TRUE


So to the question in your subject, no "k" (a double by default) is not
the same as "k:k" (a integer by default).

HTH,

Marc Schwartz




More information about the R-help mailing list