Skip to content

A 'true' R-wrapper for C++ classes

3 messages · Ali -, Duncan Murdoch, Brian Ripley

#
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
#
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.
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
#
On Mon, 18 Apr 2005, Ali - wrote:

            
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).