[Rcpp-devel] Create and access several instances of a C++ class from R
On 13.05.2011, at 18:55, Dirk Eddelbuettel wrote:
On 13 May 2011 at 16:11, soeren.vogel at uzh.ch wrote: | Following all recommendations, we have rewritten our class to use STL. However, I have been trying around with various changes, but I can't get it working with RCPP_MODULES. Also, the code snippets posted by Romain Francois did not help since we cannot use inline, rather we need raw C++ code that can be compiled using R CMD BUILD etc. Therefore, I kindly ask the experts here for an example adaption to the source below. I guess you experts instantly see what needs to be done next to make the code working. Could you please give tips for the next step? Could you detail what you mean by "can't get it working"? Does it not compile? If so, can you show how you tried to compile and the error you are getting? I'd like to help, but there is not enough information in this post.
Hello Dirk
Compilation with R CMD CHECK FOO fails with the following error in 00install.out:
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/Users/sovo/GUTS/FOO.Rcheck/FOO/libs/i386/FOO.so':
dlopen(/Users/sovo/GUTS/FOO.Rcheck/FOO/libs/i386/FOO.so, 6): Symbol not found: __ZN3FOOC1Ev
Referenced from: /Users/sovo/GUTS/FOO.Rcheck/FOO/libs/i386/FOO.so
Expected in: flat namespace
The (original) class and its functions compile fine with R CMD SHLIB. So we guess that this error has something to do with the Rcpp modules implementation.
Currently, FOO_mod.cpp is embedded in a package "FOO" created with Rcpp.pack...("FOO", module=TRUE), DESCRIPTION and NAMESPACE were adjusted accordingly, all other C sources were removed. Recapture that the package compiled and installed with our previous FOO version, however, since we wanted to use pointers, rewriting was necessary. After that, even exposing a blank class (FOO without anything, except the constructor, but that again without parameters) fails with the error above. I guess that we still do not manage to expose the variables and the one method used in the class to R -- but we have no idea how to accomplish. If I know how to do it with one, say, int, one vector and the one method, perhaps I could understand how to do for the (many more) other variables in the complete class (indeed, FOO is only a reduced example).
What we want to prevent is to completely write the C-code for R use only. The best solution would be to change only some lines of code or even write a simple wrapper for the header file containing the class (there in C++). However, we thought it would be helpful to get it working in the first place, and then reengineer the code back to a more modular source.
Thank you for your help
S?ren
| /* FOO_mod.cpp */
| #include <Rcpp.h>
| #include <vector>
| #include <valarray>
| using namespace std;
|
| // from FOO.h
| class FOO
| {
| double dtau;
| vector<double> D, ee, ff, S;
|
| public:
| int M;
| vector<double> C, t, s, par;
| vector<int> y;
|
| FOO();
| ~FOO();
|
| double do_bar(vector<double> z);
| };
|
| // from FOO.cpp
| double FOO::do_bar(vector<double> z)
| {
| // whatever it does
| }
|
| RCPP_MODULE(mod_foo){
| using namespace Rcpp ;
| class_<FOO>( "FOO" )
| .constructor()
| .field( "M" , &FOO::M )
| .field( "C" , &FOO::C )
| .method( "do_bar", &FOO::do_bar )
| ;
| }
|
--
Gauss once played himself in a zero-sum game and won $50.
-- #11 at http://www.gaussfacts.com