[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