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
______________________________________________ R-devel@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-devel