# [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)
>  TRUE
>
> However,
>
> identical(4,4:4)
>  FALSE
>
> and
>
> > identical(4.0,4.0:4.0)
>  FALSE
>
> A closer look reveals that the colon operator produces objects of
> different class, e.g.
>
> > class(4)
>  "numeric"
> > class(4.0)
>  "numeric"
>
> but
>
> > class(4:4)
>  "integer"
> > class(4.0:4.0)
>  "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))
 "double"

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

> identical(4, seq(4, 4, by = 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

```