From ripley@stats.ox.ac.uk  Mon May 22 07:22:22 2000
From: ripley@stats.ox.ac.uk (Prof Brian D Ripley)
Date: Mon, 22 May 2000 07:22:22 +0100 (BST)
Subject: [Rd] Inconsistencies (PR#550)
In-Reply-To: <200005220239.EAA14342@pubhealth.ku.dk>
Message-ID: <Pine.GSO.4.05.10005220714430.14583-100000@auk.stats>

On Mon, 22 May 2000 berwin@maths.uwa.edu.au wrote:

> Dear all,
> 
> I was playing around with some C-code that I dynamically linked to R
> and noticed the following inconsistency:
> 
> > dat <- matrix(1,3,3)
> > is.double(dat)
> [1] TRUE
> > is.integer(dat)
> [1] FALSE
> > dat <- matrix(1:9,3,3)
> > is.double(dat)
> [1] FALSE
> > is.integer(dat)
> [1] TRUE
> 
> How did I find out?  I passed `dat' to a double * in the C-code and
> printed out the matrix from C.  But in the .C() call I just passed
> down `dat' and forgot to coerce to double via `as.double(dat)'.  Of
> course the print out from the C routine was garbage, but since I used
>         dat <- matrix(1,3,3)
> first, I was confused.  Note that R says that `dat' is.double!  But it
> seems to pass dat to C as an integer matrix nevertheless!  Using the
> second matrix it became clear to me why I saw garbage being printed
> out from the C-routine.  My question is now why does the first
> `is.double(dat)' returns `TRUE'?

Because it is double!   This refers to the storage mode, not the
mathematical properties of the object's content.

I can find no inconsistency.  1 is double, and 1:9 is integer (just as
in S-PLUS 3.x).  Why should this not be the case?  Currently the
only time in R you are likely to get an integer result is a : or seq
expression, but you are not supposed to rely on this.  (Since I know
you have a copy, this is exactly the problem of the wam example
on page 203 of `S Prograaming'.)

For example, if printit.c is

void printit(double *x, int *n)
{
    int i;
    
    for(i = 0; i < *n; i++) printf("[%d] %f\n", i, x[i]);
}

> dat <- matrix(1,3,3)
> is.double(dat)
[1] TRUE
> invisible(.C("printit", dat, as.integer(9)))
[0] 1.000000
[1] 1.000000
[2] 1.000000
[3] 1.000000
[4] 1.000000
[5] 1.000000
[6] 1.000000
[7] 1.000000
[8] 1.000000
>  dat <- matrix(1:9,3,3)
> invisible(.C("printit", dat, as.integer(9)))
[0] 0.000000
[1] 0.000000
[2] 0.000000
[3] 0.000000
[4] 0.000000
[5] 0.000000
[6] 0.000000
[7] 0.000000
[8] 0.000000

as I would expect.

I think the moral is that you cannot assume the storage mode of
expressions returned by R (or by S).


-- 
Brian D. Ripley,                  ripley@stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272860 (secr)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


[Rd] Inconsistencies (PR#550)
Prof Brian D Ripley