[Rcpp-devel] RFC: Rcpp modules vs. RefClass
Christian Gunning
xian at unm.edu
Tue Nov 29 05:40:55 CET 2016
Dear List,
The following is a general request for advice / comment on modern Rcpp
development best-practices for package & class development. I looked over
the Rcpp gallery, and didn't see anything obvious that answers my
questions - perhaps this discussion could serve as a prototype for a new
post?
## Background
I've used Rcpp modules for several projects where in-place modification was
required for performance reasons. I like the interface - it encourages
clean code, and yields a nice mix of performance and encapsulation.
In the past, the lack of serialization has been a minor annoyance.
Honestly, it's not something I need, but I dislike having invalid objects
in the work-space after a quit/restart. I've spent a little time thinking
about work-arounds, which essentially boil down to moving back and forth
from an R list object.
Looking towards the future, I also looked at the recent Rcpp dev history.
It looks like modules has had some maintenance issues - for example, the
last edits there (i..e, PR 454) were reverted due to Windows toolchain
issues (i.e., https://github.com/RcppCore/Rcpp/issues/463). From my
outside perspective, it appears that the modules code is A) hard, and B)
not a current dev priority.
## A possible alternative: RefClass
I'm able to achieve similar behavior (in-place modification using named
methods, relatively tidy code) using a combination of R RefClasses and Rcpp
attributes. This solves the issue of serialization, and yields reasonably
clean code. This has the added benefit of allowing easy mixing of R and C++
code in class methods.
>From a user perspective, RefClass methods are a nice place for Rcpp
functions that modify args in-place, since RefClass implies side-effects.
And, in terms of style, if all C++ method functions return void, and have
const-correct arglists, then the C++ function signatures provide something
of a interface spec.
Minimal example:
https://gist.github.com/helmingstay/17d5d9f241c4170a29d1681db0111065
## Summary of observations:
* RefClass + attributes achieves similar outcomes to Rcpp modules, with
somewhat better support (serialization, documentation, future?).
* Unique to Rcpp modules is the ability to auto-magically generate
RefClass-like R bindings for existing C++ class-based code.
* For "mere mortals", Rcpp modules now look less attractive for routine
use, given available alternatives (i.e. for anything but binding
auto-generation)
## Questions:
A) Any obvious problems with the above observations?
B) Are there any *gotchas* with using Rcpp "modify-in-place" functions
inside RefClass methods?
C) Is anyone else doing this? Any suggested improvements on the above?
Thanks much,
Christian Gunning
--
A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20161128/65d7bb99/attachment.html>
More information about the Rcpp-devel
mailing list