Jonathan, Rconsider the // [[Rcpp::interfaces(cpp)]] attribute. That is documented in the attributes vignette.

In essence, in the host package (called "host" here), you have this in your C++ file:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::interfaces(cpp)]]

// [[Rcpp::export]]
NumericVector fun() {
    return rnorm(10) ;
}

// [[Rcpp::export]]
NumericVector foo(double x) {
    return rnorm(10) ;
}

With Rcpp::interfaces(cpp) you express that you want these functions available at the C++ layer in client packages.

Then you call compileAttributes and build the "host" package.


Now, when you want to use it in the client package, you do:
- add LinkingTo: host in client's DESCRIPTION
- include the host.h file
- refer to functions from host with the host:: namespace in C++ code, e.g. :

#include <host.h>

// [[Rcpp::export]]
List do_stuff() {

    List res = List::create(
        host::foo(2.),
        host::fun()
        ) ;
    return res ;
}


That's it. The code generated by compileAttributes takes care of registering and retrieving the functions.

Romain

Le 16/10/13 04:34, Jonathan Olmsted a écrit :
Finally, some closure...

Romain, as you sensed, I did not *really* need linking. Of course, I did
not realize that earlier. You were completely right to point in the
direction of registering functions. And, while I wish this was some new
feature, it's been in R for a *long* time. How the answer could be
mentioned in R-exts with me completely missing it I have no idea (but
I'm not surprised, I guess).

It took me longer than I'm willing to reveal to get the functions
registered in the "host package" (if you will). It then took me another
similarly long block of time to figure out function pointers. And, it
then took me a third one of these blocks to figure out how "LinkingTo"
factored in (prior to this, I'd been calling "R_GetCCallable" on the
"client package" side. However, I finally got that squared away after
working through the Rcpp11 repo. As you well know, this approach is
impressively clean from the perspective of the "client package". Just
include a header and you are done.

Darren, I thought I'd just ask about permission first before making
someone think hard about an already solved problem. But, that's a clever
idea all the same.

One sticking point for me was inferring the general from that the
examples (e.g., Rcpp11, Matrix) which used slightly different approaches
and, of course, had other moving parts.

Dirk, If I just looked in the right spot of xts, I'd have seen the
header trick on the "host package" spelled out in plain English. *sigh*

In general, I'm quite curious how widely used this is (just a matter of
a script over the DL-ed ReverseDepends of Rcpp packages) . It'd be a
shame for devs not to use it more and expose their functionality.

Many thanks for everyone's help!

-Jonathan






-------------------------------------------------------------------------
J.P. Olmsted
[email protected] <mailto:[email protected]>
http://about.me/olmjo
-------------------------------------------------------------------------



On Tue, Oct 15, 2013 at 7:01 PM, Darren Cook <[email protected]
<mailto:[email protected]>> wrote:

     > Intellectual property rights confuse the heck out of me so I
    wanted to ask
     > explicitly before stepping on any toes. Rcpp is GPL-2. However, the
     > Makevars in the ./src/ directory don't necessarily carry the same
    license
     > header as your Cpp source. What are your intentions for
    derivative use of
     > the Makevars files you guys use in Rcpp? Specifically, I would
    like to use
     > your strategy in an R package to build a static lib for
    subsequent linking
     > against by other R packages.

    You could also describe your actual need on StackOverflow; IIRC the
    terms and conditions explicitly say all code posted there can be treated
    as public domain.

    If someone gives you the same approach then perhaps there is only one
    way to do it; if someone gives you a different way perhaps that will be
    just as good.

    Darren

    P.S. This idea falls flat if someone just says take a look at the Rcpp
    Makevars file ;-)

    _______________________________________________
    Rcpp-devel mailing list
    [email protected]
    <mailto:[email protected]>
    https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel




_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel



--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30

_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to