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
A 'true' R-wrapper for C++ classes
2 messages · Ali -, Duncan Murdoch
Sorry about the mistake in the previous post, here is the corrected version:
And I've just added responses to part of it:
(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.
I think you'll have to ask the OOP author this one. Generally R doesn't have pointers, so when a package provides them, it needs to do a lot of low level support for them.
Also I am curious to know why there is no standard method for R to wrap C++ classes, something like JNI.
I think it would be harder to write such a thing, in that R and C++ are more different than Java and C++ are. Duncan Murdoch