[Rcpp-devel] Create and access several instances of a C++ class from R
soeren.vogel at uzh.ch
soeren.vogel at uzh.ch
Fri May 13 20:07:21 CEST 2011
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
>
More information about the Rcpp-devel
mailing list