[Rcpp-devel] Create and access several instances of a C++ class from R
Douglas Bates
bates at stat.wisc.edu
Wed May 18 15:17:15 CEST 2011
On May 18, 2011 2:53 AM, <soeren.vogel at uzh.ch> wrote:
>
> Hello Dirk
>
> That was exactly the trick! Thanks a lot! Our class and code work so far,
but it may take more time to debug or find bad design. Perhaps we will be
back with more detailed questions. Anyway, one question already emerged.
When librarying the class, assigning an object, do some calculations,
whatever -- everything goes fine. Yet, when using R CMD BATCH on a file
listing the same commands as by hand, R produces some nice information at
the end, however, here it produces an segmentation fault, which does --
according to my small knowledge -- say something bad:
>
> > proc.time()
> user system elapsed
> 0.702 0.017 0.714
> R(72992) malloc: *** error for object 0x2c9b604: incorrect checksum for
freed object - object was probably modified after being freed.
> *** set a breakpoint in malloc_error_break to debug
>
> *** caught segfault ***
> address 0x4909d58, cause 'memory not mapped'
>
> Traceback:
> 1: save(list = ls(envir = .GlobalEnv, all.names = TRUE), file = outfile,
version = version, ascii = ascii, compress = compress, envir =
.GlobalEnv, precheck = FALSE)
> 2: save.image(name)
> 3: sys.save.image(".RData")
> aborting ...
>
> Any idea what goes wrong there?
>
> Regards
> Sören + Carlo
>
As you can see, the problem occurs when R is saving the worksheet. At
present an instance of a Rcpp module class cannot be saved. It is likely
that this will need to be addressed by the person designing each C++ class
that will be expressed in a module. R can't serialize the contents of
memory that it doesn't "own".
The current fix is "don't do that". Add the --no-save or --vanilla in your
call to R CMD BATCH to suppress saving the worksheet.
> On 14.05.2011, at 18:17, Dirk Eddelbuettel wrote:
>
> Soeren,
>
> On 13 May 2011 at 20:07, soeren.vogel at uzh.ch wrote:
> | 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.
>
> It took me a few minutes with trial and error, but essentially the mistake
> seems to have been this:
>
> | > | FOO();
> | > | ~FOO();
>
> You declared the constructor and deconstructor but there was no code
> anywhere. A pair of empty braces ' {}; ' is all it takes.
>
> In the process, I renamed things from 'foo' (just to be plain) to 'Baz'.
So
> the file is now
>
>
-----------------------------------------------------------------------------
> // baz_module.cpp
> #include <Rcpp.h>
>
> // from Baz.h
> class Baz
> {
> private:
> double dtau;
> std::vector<double> D, ee, ff, S;
>
> public:
> int M;
> std::vector<double> C, t, s, par;
> std::vector<int> y;
>
> Baz() {};
> ~Baz() {};
>
> double do_bar(std::vector<double> z);
> };
>
> // from Baz.cpp
> double Baz::do_bar(std::vector<double> z) {
> // whatever it does
> return 42.0; // need to return something here
> }
>
> RCPP_MODULE(baz){
> using namespace Rcpp ;
> class_<Baz>( "Baz" )
> .constructor()
> .field( "M" , &Baz::M )
> .field( "C" , &Baz::C )
> .method( "do_bar", &Baz::do_bar )
> ;
> }
>
-----------------------------------------------------------------------------
>
> and with the line
>
> RcppModules: yada, baz
>
> we get this module loaded:
>
>
> R> library(mypackage)
> R> Baz
> C++ class 'Baz' <0x1c37db0>
> Constructors:
> Baz()
>
> Fields:
> std::vector<double, std::allocator<double> > C
> int M
>
> Methods:
> double do_bar(std::vector<double, std::allocator<double> >)
>
> R>
> R> bb <- new(Baz)
> R> bb
> C++ object <0x18c8f90> of class 'Baz' <0x1c37db0>
> R> bb$M <- 12
> R> print(bb$M)
> [1] 12
> R> print(bb$C)
> numeric(0)
> R> bb$C <- seq(1.1, 5.5, by=1.1)
> R> bb$C
> [1] 1.1 2.2 3.3 4.4 5.5
> R> R> print(bb$do_bar(1:4))
> [1] 42
> R>
>
>
> I hope you can take it from here.
>
> Cheers, Dirk
>
> --
> Gauss once played himself in a zero-sum game and won $50.
> -- #11 at http://www.gaussfacts.com
>
> _______________________________________________
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20110518/ce8175bb/attachment.htm>
More information about the Rcpp-devel
mailing list