[R] getAttr problem

Stoyanov, Tsvetan tsvetan.stoyanov at mirant.com
Fri May 9 16:55:13 CEST 2003


Correct,

I meant getAttrib, and the "names" attribute is indeed NULL. I meant to say that the "dimnames" attribute of the outer product id NULL, when it should be given by those of the arguments.

I am just trying to reproduce the example in section 4.7.4:

out.R:
------
out <- function(x, y) .Call("out", as.double(x),as.double(y))

out.c:
------
#include <R.h>
#include <Rinternals.h>
SEXP out(SEXP x, SEXP y)
{
  int i, j, nx, ny;
  double tmp;
  SEXP ans, dim, dimnames;
  nx = length(x); ny = length(y);
  PROTECT(ans = allocVector(REALSXP, nx*ny));
  for(i = 0; i < nx; i++) {
    tmp = REAL(x)[i];
    for(j = 0; j < ny; j++)
      REAL(ans)[i + nx*j] = tmp * REAL(y)[j];
  }
  PROTECT(dim = allocVector(INTSXP, 2));
  INTEGER(dim)[0] = nx; INTEGER(dim)[1] = ny;
  setAttrib(ans, R_DimSymbol, dim);
  PROTECT(dimnames = allocVector(VECSXP, 2));
  SET_VECTOR_ELT(dimnames, 0, getAttrib(x,R_NamesSymbol));
  SET_VECTOR_ELT(dimnames, 1, getAttrib(y, R_NamesSymbol));
  setAttrib(ans, R_DimNamesSymbol, dimnames);
  UNPROTECT(3);
  return(ans);
}

Create out.dll, start R and here is the output:
-----------------------------------------------

> a
a1 a2 
 1  2 
> b
b1 b2 b3 
 3  4  5 
> dyn.load("out.dll")
> out(a,b)
     [,1] [,2] [,3]
[1,]    3    4    5
[2,]    6    8   10


If you replace the last line of out.c with 
return(getAttrib(x, R_NamesSymbol));
you will see that getAttrib returns NULL.


Tsvetan

-----Original Message-----
From: Prof Brian Ripley [mailto:ripley at stats.ox.ac.uk]
Sent: Friday, May 09, 2003 10:44 AM
To: Stoyanov, Tsvetan
Cc: 'r-help at stat.math.ethz.ch'
Subject: Re: [R] getAttr problem


On Fri, 9 May 2003, Stoyanov, Tsvetan wrote:

> It seems that getAttr doesn't return "names" attribute properly as in

Is this getAttrib?

> getAttrib(x, R_NamesSymbol));

Really?  As it is widely used inside R, that seems implausible.

> If you look at section 4.7.4 in "Writing R Extensions", the second example of
> SEXP out(SEXP, SEXP) returns NULL for the names attribute of the 
> outer product. 

But the outer product is a matrix and does not have names, so NULL is 
correct.

> This is true for  R 1.7.0 on both Win2000 with mingw and Redhat 9.0 with gcc.

Well, the source code is the same for both systems, so that is not 
surprising (and BTW `mingw' is on ix86 port of gcc, and RH9 (no .0?) 
uses another ix86 port of gcc).

> Is there something I am missing?

Yes: could you supply a complete example with the results you get and an 
explanation as to why you think it is wrong?

-- 
Brian D. Ripley,                  ripley at 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 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595




More information about the R-help mailing list