[Rd] RE: A 'true' R-wrapper for C++ classes

2005-04-18 Thread Ali -
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


Re: [Rd] RE: A 'true' R-wrapper for C++ classes

2005-04-18 Thread 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

__
R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel