As of a recent version of Rcpp on r-forge (rev. 3582 or later), there is a new facility for defining an R class extending a C++ class extracted from a module. The main tool is setRcppClass in package Rcpp. See its documentation. Also in the unittests directory of package Rcpp is an example package, testRcppClass, that has some typical applications. The general idea is that setRcppClass() defines a reference class built around a particular C++ class, with optionally additional fields and methods defined in R. The R methods can refer to C++ fields and methods. The general goal is to be able to use R for prototyping new features that could then be implemented in C++ if they are useful and need performance. The new code relies on load-time actions, introduced in R 2.15.0, because information about the C++ class is not available until the compiled code is linked with the R process. Load time actions allow a package to include setRcppClass() calls in its source code in the same way other class/method definitions would be. But the action all really happens at load time. In particular, any extensions to these classes have to be done at load time as well, using load actions or setRcppClass() calls. This is all new stuff and still experimental. There are a couple of known limitations, plus probably unknown glitches. For now, objects from modules need to be explicitly exported if your package wants to export them. (Classes are exported either explicitly or by pattern). Also, when running your package through CMD check, you may get bizarre complaints about loading the package with only base attached. And you will very likely get notes about code for any reference class methods that refer to field names, which codetools can't distinguish from global variables. John
[Rcpp-devel] R classes extending C++ classes
2 messages · John Chambers
4 days later
The two limitations mentioned below, export patterns and loading warning from CMD check, should have been fixed in the current versions of r-devel and 2.15 patched. The "global variables" note remains, but it's been remarked often in other contexts as well. John
On 4/20/12 9:46 AM, John Chambers wrote:
As of a recent version of Rcpp on r-forge (rev. 3582 or later), there is a new facility for defining an R class extending a C++ class extracted from a module. The main tool is setRcppClass in package Rcpp. See its documentation. Also in the unittests directory of package Rcpp is an example package, testRcppClass, that has some typical applications. The general idea is that setRcppClass() defines a reference class built around a particular C++ class, with optionally additional fields and methods defined in R. The R methods can refer to C++ fields and methods. The general goal is to be able to use R for prototyping new features that could then be implemented in C++ if they are useful and need performance. The new code relies on load-time actions, introduced in R 2.15.0, because information about the C++ class is not available until the compiled code is linked with the R process. Load time actions allow a package to include setRcppClass() calls in its source code in the same way other class/method definitions would be. But the action all really happens at load time. In particular, any extensions to these classes have to be done at load time as well, using load actions or setRcppClass() calls. This is all new stuff and still experimental. There are a couple of known limitations, plus probably unknown glitches. For now, objects from modules need to be explicitly exported if your package wants to export them. (Classes are exported either explicitly or by pattern). Also, when running your package through CMD check, you may get bizarre complaints about loading the package with only base attached. And you will very likely get notes about code for any reference class methods that refer to field names, which codetools can't distinguish from global variables. John
_______________________________________________ Rcpp-devel mailing list Rcpp-devel at lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel