I don't know enough about the mechanics of your scenario to comment intelligently, but I would in general agree with Dirk that if there is a way to put something like this in a package that's the way it ought to be done. You could certainly dispatch to different C++ functions within a package using a variety of mechanisms including C++ templates, C-style function pointers, etc. (the mechanics of doing so for your situation I'm unsure of, but it should be possible).
On Thu, Apr 14, 2016 at 12:25 AM, Martin Lysy <ml...@uwaterloo.ca> wrote: > Hello Dirk, > > For my specific purpose I have some reservations about package creation. > Here is a description of the project I have in mind. > > I would like to use Rcpp to create a set of generic MCMC algorithms, into > which a useR could easily hook their own target distributions written in > C++ with minimal effort. For example, I would provide the following files: > > -------------------------------------- > GibbsSampler.cpp > > //[[Rcpp::export]] > NumericMatrix GibbsSampler(int nIter, NumericVector xInit, List > tuningParams) { > // run some flavor of the Gibbs sampler > } > --------------------------------------- > GibbsSampler.h > > double logDensity(NumericVector x); > --------------------------------------- > > Then the useR would write MyDensityA.cpp, which contains the definition of > logDensity, compile the three files, and have a Gibbs sampler for their > specific density function written in C++ and ready to go in R. However, a > useR might wish to use the GibbsSampler for a different density tomorrow. > They would have a different definition of logDensity in MyDensityB.cpp. > Ideally, the useR would have access to Gibbs samplers for both densities in > the same R session. > > I can think of two ways of doing this with Rcpp: > > 1. Compile with sourceCpp (this is what I'm currently doing). There's > the minor issue of giving separate R names to each Gibbs sampler, but there > are many ways around that. The major issue is that sourceCpp only accepts > a single .cpp file (or at least as far as my attempts were unsuccessful in > the original post). So I'm stuck text-processing a bunch of .cpp and .h > files together (the actual project I'm working on has about a dozen of > each). > > 2. Compile an entire R package for each of MyDensityA and MyDensityB. > However, it seems somewhat cumbersome to have a package loaded for every > density function in the workspace. Moreover, naming conflicts are a bit > more tricky. Right now (with sourceCpp), I'm using an interface of the form > > smpA <- gibbs.sampler(density = MyDensityA, niter = 1e4) > smpB <- gibbs.sampler(density = MyDensityB, niter = 1e4) > > This is to align with things like lm(formula = MyModel). However, I can't > quite see how to do this with separate packages loaded. Rather it seems > I'd need something like > > smpA <- gibbs.sampler.MyDensityA(niter = 1e4) > smpB <- gibbs.sampler.MyDensityB(niter = 1e4) > > However, to do this with packages I feel like I would still have to do > some text replacement, which I'm already doing with the sourceCpp approach. > > In summary, I am not opposed to package creation, but I hope you can see > my reservations at taking this route. Perhaps you could please suggest a > way to achieve what I'm after with separate Rcpp packages for each density > function. I take it from your reluctance to answer my original post that > Rcpp only supports compilation of multiple files through the package > creation protocol. I can think of many applications in which the useR > could supply a minimal amount of C++ code (e.g., a log-likelihood function) > to hook in with a large amount of code provided by the developer in order > to speed things up considerably. So in my opinion it would be worthwhile > to devise a mechanism to do this correctly. > > Best regards, > > > Martin Lysy > Assistant Professor of Statistics > Department of Statistics and Actuarial Science > University of Waterloo > > On Wed, Apr 13, 2016 at 5:34 PM, Dirk Eddelbuettel <e...@debian.org> wrote: > >> >> Martin, >> >> Please please please look into creating a package. >> >> If you use RStudio: File -> New Project -> (New or Existing) Directory -> >> Package and then select Rcpp. >> >> If not, consider install the (very tiny) pkgKitten package and call >> Rcpp.package.skeleton() from Rcpp itself (but enhanced by pkgKitten if >> present) for a saner package. >> >> Cheers, Dirk >> >> -- >> http://dirk.eddelbuettel.com | @eddelbuettel | e...@debian.org >> > > > _______________________________________________ > Rcpp-devel mailing list > Rcpp-devel@lists.r-forge.r-project.org > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel >
_______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel