[Rd] Problem with S4 slots in C code (PR#4073)

Duncan Temple Lang duncan at research.bell-labs.com
Fri Sep 5 11:29:01 MEST 2003


In the case of the .Data slot, you will probably want to use 

 FLQuant = R_do_slot_assign(FLQuant, install(".Data"), v);

rather than SET_SLOT(). I am not certain if we have updated this
yet (and it is hard for me to check with very limited network access).




L.T.Kell at cefas.co.uk wrote:
> This message is in MIME format. Since your mail reader does not understand
> this format, some or all of this message may not be legible.
> 
> ------_=_NextPart_000_01C3738F.63DE3390
> Content-Type: text/plain;
> 	charset="iso-8859-1"
> 
> #I want to be able to create a new S4 class and read data into it using C
> code
> 
> # Here is a very simple S4 object inheriting from "array", but with 5
> specified dimensions 
> #(the validity stuff has been stripped out to make it short as I don't think
> it is the problem here)
> 
> setClass("FLQuant",
> 	representation("array"),
> 	prototype=(array(1, dim=c(1,1,1,1,1), dimnames=list(age="0",
> year="0", sex="combined", season="all", area="all")))
> )
> 
> # In R, I can create a new "FLQuant" object:
> > fl <- new("FLQuant")
> > fl
> An object of class "FLQuant"
> , , sex = combined, season = all, area = all
> 
>    year
> age 0
>   0 1
> 
> # and:
> > aa <- array(2, dim=c(1,1,1,1,1), dimnames=list(age="1", year="2000",
> sex="combined", season="all", area="all"))
> > aa
> , , sex = combined, season = all, area = all
> 
>    year
> age 2000
>   1    2
> 
> # Putting the array aa into fl is done like this (by the way, is this a
> correct way to do it?):
> > fl at .Data <- aa
> > fl
> An object of class "FLQuant"
> , , sex = combined, season = all, area = all
> 
>    year
> age 2000
>   1    2
> 
> # Now, we want to do the same in C, to interface with existing code.
> # However, the .Data slot is not being replaced with the new object
> 
> 
> > dyn.load("C:/fl/flr/flr.dll")
> > test<-function() .Call("Test")
> > test()
> 
> An object of class "FLQuant":
> 
> , , sex = combined, season = all, area = all
> 
>    year
> age 0
>   0 1
> > 
> 
> #C code to do the same thing
> extern "C" __declspec(dllexport) SEXP __stdcall Test(void)
>     {
>     SEXP FLQuant, v, 
>          d1, d2, d3, d4, d5,  
>          dim,   dimnames, names;    
> 
>     //Create new S4 object    
>     PROTECT(FLQuant = NEW_OBJECT(MAKE_CLASS("FLQuant")));
> 
>     //Create array for slot    
>     //Set dimensions of array
>     PROTECT(dim     = allocVector(INTSXP, 5));       
>     INTEGER(dim)[0] = 1;
>     INTEGER(dim)[1] = 1;
>     INTEGER(dim)[2] = 1; 
>     INTEGER(dim)[3] = 1; 
>     INTEGER(dim)[4] = 1; 
>         
>     //Allocate memory
>     PROTECT(v = Rf_allocArray(REALSXP, dim)); 
>     
>     //Create dimension names
>     PROTECT(dimnames = allocVector(VECSXP, 5));
>     
>     PROTECT(d1 = allocVector(INTSXP, 1));
>     INTEGER(d1)[0] = 1; 
>     SET_VECTOR_ELT(dimnames, 0, d1);
>     
>     PROTECT(d2 = allocVector(INTSXP, 1));
>     INTEGER(d2)[0] = 2000; 
>     SET_VECTOR_ELT(dimnames, 1, d2);
>      
>     PROTECT(d3 = allocVector(STRSXP, 1));
>     SET_STRING_ELT(d3, 0, mkChar("combined"));
>     SET_VECTOR_ELT(dimnames, 2, d3);
>     
>     PROTECT(d4 = allocVector(STRSXP, 1));
>     SET_STRING_ELT(d4, 0, mkChar("all"));
>     SET_VECTOR_ELT(dimnames, 3, d4);
>     
>     PROTECT(d5 = allocVector(STRSXP, 1));
>     SET_STRING_ELT(d5, 0, mkChar("all"));
>     SET_VECTOR_ELT(dimnames, 4, d5);
>     
>     //Create names for dimensions
>     PROTECT(names = allocVector(STRSXP, 5));
>     SET_STRING_ELT(names, 0, mkChar("age"));
>     SET_STRING_ELT(names, 1, mkChar("year"));
>     SET_STRING_ELT(names, 2, mkChar("sex"));
>     SET_STRING_ELT(names, 3, mkChar("season"));
>     SET_STRING_ELT(names, 4, mkChar("area"));
>     setAttrib(dimnames, R_NamesSymbol, names);
>     setAttrib(v, R_DimNamesSymbol, dimnames);
>     
>     //Set data
>     REAL(v)[0] = 2;
>            
>     //Set slot
>     SET_SLOT(FLQuant, install(".Data"), v);
> 
>     UNPROTECT(10);
>     
>     return FLQuant;
>     }
> 
> 
>  
> 
> 
> 
> 
> --please do not edit the information below--
> 
> Version:
>  platform = i386-pc-mingw32
>  arch = i386
>  os = mingw32
>  system = i386, mingw32
>  status = 
>  major = 1
>  minor = 7.1
>  year = 2003
>  month = 06
>  day = 16
>  language = R
> 
> Windows 2000 Professional (build 2195) Service Pack 3.0
> 
> Search Path:
>  .GlobalEnv, package:methods, package:ctest, package:mva, package:modreg,
> package:nls, package:ts, Autoloads, package:base
> 
>  <<Laurence Kell (E-mail).vcf>> 
> 
> ------_=_NextPart_000_01C3738F.63DE3390
> Content-Type: application/octet-stream;
> 	name="Laurence Kell (E-mail).vcf"
> Content-Disposition: attachment;
> 	filename="Laurence Kell (E-mail).vcf"
> 
> BEGIN:VCARD
> VERSION:2.1
> N:Kell;Laurence
> FN:Laurence Kell (E-mail)
> ORG:CEFAS
> TEL;WORK;VOICE:+44 (0) 1502 524257
> TEL;WORK;FAX:+44 (0) 1502 524511
> ADR;WORK:;;Lowestoft Laboratory;Pakefield Road;Lowestoft,;NR33 0HT;UK
> LABEL;WORK;ENCODING=QUOTED-PRINTABLE:Lowestoft Laboratory=0D=0APakefield Road, Lowestoft, NR33 0HT=0D=0AUK
> EMAIL;PREF;INTERNET:/o=CEFAS/ou=LOWESTOFT/cn=Recipients/cn=LTK00
> REV:20030410T130517Z
> END:VCARD
> 
> ------_=_NextPart_000_01C3738F.63DE3390--
> 
> ______________________________________________
> R-devel at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-devel

-- 
_______________________________________________________________

Duncan Temple Lang                duncan at research.bell-labs.com
Bell Labs, Lucent Technologies    office: (908)582-3217
700 Mountain Avenue, Room 2C-259  fax:    (908)582-3340
Murray Hill, NJ  07974-2070       
         http://cm.bell-labs.com/stat/duncan



More information about the R-devel mailing list