Hello I am trying to wrap some C++ classes into R. (1) Comparing the OOP and methods packages, I have came to this conclusion that OOP works much better for this wrapper -- please correct me if I am wrong. One question is why this useful package (OOP) is not included in the official release of R? (2) Choosing the OOP package way, I have carried out the following steps to wrap the C++ classes: (2.1) A C-wrapper is created to convert the C++ class to some C-style code. (2.2) An R-wrapper wraps the C-wrapper. Here is a rough example to demonstrate the above: --------------------- C++ class: class foo { public: foo(); ~foo(); fun(); } --------------------- C-wrapper: extern "C" SEXP R_foo_init() { foo* obj = new foo(); SEXP res; PROTECT(res = R_MakeExternalPtr(obj, R_NilValue, R_NilValue)); UNPROTECT(1); return res; } extern "C" SEXP R_foo_fun(SEXP ptr) { foo *ptr = Hello I am trying to wrap some C++ classes into R. (1) Comparing the OOP and methods packages, I have came to this conclusion that OOP works much better for this wrapper -- please correct me if I am wrong. One question is why this useful package (OOP) is not included in the official release of R? (2) Choosing the OOP package way, I have carried out the following steps to wrap the C++ classes: (2.1) A C-wrapper is created to convert the C++ class to some C-style code. (2.2) An R-wrapper wraps the C-wrapper. Here is a rough example to demonstrate the above: --------------------- C++ class: class foo { public: foo(); ~foo(); fun(); } --------------------- C-wrapper: extern "C" SEXP R_foo_init() { foo* obj = new foo(); SEXP res; PROTECT(res = R_MakeExternalPtr(obj, R_NilValue, R_NilValue)); UNPROTECT(1); return res; } extern "C" SEXP R_foo_fun(SEXP ptr) { foo *= Hello I am trying to wrap some C++ classes into R. (1) Comparing the OOP and methods packages, I have came to this conclusion that OOP works much better for this wrapper -- please correct me if I am wrong. One question is why this useful package (OOP) is not included in the official release of R? (2) Choosing the OOP package way, I have carried out the following steps to wrap the C++ classes: (2.1) A C-wrapper is created to convert the C++ class to some C-style code. (2.2) An R-wrapper wraps the C-wrapper. Here is a rough example to demonstrate the above: --------------------- C++ class: class foo { public: foo(); ~foo(); fun(); } --------------------- C-wrapper: extern "C" SEXP R_foo_init() { foo* ptr= new foo(); SEXP res; PROTECT(res = R_MakeExternalPtr(ptr, R_NilValue, R_NilValue)); UNPROTECT(1); return res; } extern "C" SEXP R_foo_fun(SEXP obj) { foo *ptr= (foo *) R_ExternalPtrAddr(obj); ptr->fun(); return R_NilValue; } --------------------- R-wrapper: defineClass(className = "foo"); vtkObject$defineFields(ptr = "externalptr"); vtkObject$defineMethod( "initialize", function(){ ptr <- .Call("R_foo_init") } ); vtkObject$defineMethod( "fun", function() { .Call("R_foo_fun", ptr); } ); -------------------- (3) The above model lacks something like an 'environment' for the pointer to the C++ object to live in it. Assume we create the foo class in R like: obj <- foo$new() Now, the following would return an error: obj$fun() and the reason is that the pointer created in the initialize method is lost. (4) The question is how to assign an environment to the pointers. A well described answer, rather than some abstract hints, is well-appreciated. Also I am curious to know why there is no standard method for R to wrap C++ classes, something like JNI. Thanks, Ali
> Hello > > I am trying to wrap some C++ classes into R. > > (1) Comparing the OOP and methods packages, I have came to this conclusion > that OOP works much better for this wrapper -- please correct me if I am > wrong.The methods package using a different conceptual model of object-oriented programming than C++ uses, one based on generic functions rather than methods being defined within classes. You should also look at the R.oo package for another way to do what you want.> One question is why this useful package (OOP) is not included in > the > official release of R?There are a lot of useful packages that aren't in R. They can't all be. Another question is why OOP is not on CRAN. This would be because its author (John Chambers) thought Omegahat.org was a better place to put it (assuming you're talking about that OOP). The rest of your message contained a lot of repeated copies of the same text. I didn't read it all, so might have missed something new hidden in there. Duncan Murdoch
Sorry about the mistake in the previous post, here is the corrected version: Hello I am trying to wrap some C++ classes into R. (1) Comparing the OOP and methods packages, I have came to this conclusion that OOP works much better for this wrapper -- please correct me if I am wrong. One question is why this useful package (OOP) is not included in the official release of R? (2) Choosing the OOP package way, I have carried out the following steps to wrap the C++ classes: (2.1) A C-wrapper is created to convert the C++ class to some C-style code. (2.2) An R-wrapper wraps the C-wrapper. Here is a rough example to demonstrate the above: --------------------- C++ class: class foo { public: foo(); ~foo(); fun(); } --------------------- C-wrapper: extern "C" SEXP R_foo_init() { foo* ptr= new foo(); SEXP res; PROTECT(res = R_MakeExternalPtr(ptr, R_NilValue, R_NilValue)); UNPROTECT(1); return res; } extern "C" SEXP R_foo_fun(SEXP obj) { foo *ptr= (foo *) R_ExternalPtrAddr(obj); ptr->fun(); return R_NilValue; } --------------------- R-wrapper: defineClass(className = "foo"); vtkObject$defineFields(ptr = "externalptr"); vtkObject$defineMethod( "initialize", function(){ ptr <- .Call("R_foo_init") } ); vtkObject$defineMethod( "fun", function() { .Call("R_foo_fun", ptr); } ); -------------------- (3) The above model lacks something like an 'environment' for the pointer to the C++ object to live in it. Assume we create the foo class in R like: obj <- foo$new() Now, the following would return an error: obj$fun() and the reason is that the pointer created in the initialize method is lost. (4) The question is how to assign an environment to the pointers. A well described answer, rather than some abstract hints, is well-appreciated. Also I am curious to know why there is no standard method for R to wrap C++ classes, something like JNI. Thanks, Ali
On Mon, 18 Apr 2005, Ali - wrote:> I am trying to wrap some C++ classes into R. > > (1) Comparing the OOP and methods packages, I have came to this conclusion > that OOP works much better for this wrapper -- please correct me if I am > wrong. One question is why this useful package (OOP) is not included in the > official release of R?Quick answer: almost nothing else makes use of it. The `methods' package is depended on by 27 CRAN packages and most BioC packages. The OOP package is not even on CRAN (although it once was as part of Omegahat). The official release of R contains packages that are thought to be of high quality, actively maintained and useful to a wide range of R users. And those are necessary conditions, not sufficient ones -- an at least historic criterion was to fill out coverage of the S Blue and White books and the sort of statistics covered by MASS (the book). -- 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 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595