On 06.06.2011, at 13:42, Romain Francois wrote:

> Le 04/06/11 16:31, soeren.vo...@uzh.ch a écrit :
> 
>> FOO is the C++ object, and Foo should be the S4 class. If the user creates 
>> an object, say bar, from class Foo, the creation process automatically makes 
>> a new FOO object relating to bar in that a unique name of the FOO instance 
>> is stored in a slot of bar. All the user then has to do is modify bar by 
>> simple assignments. The getters and setters ("$", "[") are set up and work. 
>> Each modification goes in hand with assigning new values to bar as well as 
>> updating the FOO object through available setters from FOO.
>> 
>> So far, this way has brought me to about 100 lines, but now I read about 
>> ReferenceClasses and was wondering, if there is a much easier way of 
>> achieving my goals. Moreover, I was not sure any longer if my goals make 
>> sense or if a more advanced programmer would do it totally different (and 
>> could share some structural thinking on their approach).
>> 
>> The idea behind my way of doing was based upon several considerations. 
>> First, a "classical" R object would not confuse users, as I assume users of 
>> my package to be rather non-skilled (and not willing to change that). 
>> Second, I want to create a properly programmed package for distribution on 
>> CRAN and publication, eventually. Third, I want to save objects across 
>> sessions. So if a user restores a session, a simple command, say, restore(), 
>> would do the trick to build all the related C++ objects again. However, I 
>> admit that I still have not figured out how to automatically clean up the 
>> workspace correctly before leaving a session, wanted or unwanted, that is, 
>> clean up memory before leaving home. Fourth, pure arithmetic check is done 
>> in C++, however, semantic check *should* be left to R, and the validity and 
>> class routines seem to be perfect for this. Fifth, some work should be done 
>> in R, such as the passing of data frames or samples from distributions.
> 
> Hello,
> 
> A C++ class that is exposed through an Rcpp module is already a reference 
> class, and so you can add methods, etc ...
> 
> Consider this example :
> 
> require(inline)
> require(Rcpp)
> 
> fx <- cxxfunction( , '', includes = '
> 
> class FOO{
> public:
>    FOO( double x_, double y_): x(x_), y(y_){}
> 
>    double x ;
>    double y ;
> 
>    void move( double dx, double dy){
>        x += dx ;
>        y += dy ;
>    }
> } ;
> 
> RCPP_MODULE(mod){
> 
>    class_<FOO>("FOO" )
> 
>        .constructor<double,double>()
> 
>        .field( "x", &FOO::x )
>        .field( "y", &FOO::y )
> 
>        .method( "move", &FOO::move )
>        ;
> }
> 
> 
> ', plugin = "Rcpp" )
> mod <- Module( "mod", getDynLib(fx),mustStart = TRUE )
> 
> # grab the exposed C++ class
> FOO <- mod$FOO
> 
> # add R methods
> FOO$methods(
>    bla = function() x+y,
>    reset = function() {
>        x <<- 0.0
>        y <<- 0.0
>    }
> )
> # create an instance
> f <- new( FOO, 2.0, 3.0 )
> 
> # call an R method
> f$reset()
> 
> # call a C++ method
> f$move( 2.0, 2.0 )
> 
> # call an R method
> f$bla()

Thanks Simon and Romain for your great help! That C++ classes exposed via 
Rcpp-modules are already reference classes helps a lot and saves time for 
unnecessary mirroring. According to Romain saving class objects across sessions 
remains to be implemented in Rcpp. I have not browsed the rJava package 
extensively, but I found serialize() (base) and this function seems to provide 
a workaround. Yet, I do not know how to use it in practice with my package. 
Some thoughts: consider the small FOO example below. Then, on accidental crash 
or quit(save="yes"), or whatever users may do, R "should" know that it has to 
serialise all existing FOO objects. Note, that in my package these objects are 
"sort of lists" that can become quite large (say, a vector of 15,000 numeric 
values plus a character string). After restoring a previously saved image, R 
"should know" to load my package, and that in turn should deserialise every FOO 
object present in the image. Sounds like a not too complicated task, something 
like .dofirst()/.dolast() -- but that again exceeds my R and C++ programming 
skills, and I hope that you experts may share an idea. Thanks, Sören

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to