[Rcpp-devel] accessing list elements without using names

Sameer Soi sameersoi at gmail.com
Fri Feb 10 22:52:43 CET 2012


Thank you, this makes more sense now. I do like the succinct, "show-off"
style; it seems to convey the meaning better.

On Fri, Feb 10, 2012 at 4:47 PM, Douglas Bates <bates at stat.wisc.edu> wrote:

> On Fri, Feb 10, 2012 at 3:30 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
> >
> > On 10 February 2012 at 15:05, Douglas Bates wrote:
> > | Or if you want to show off you could collapse it to
> > |
> > | > src <- "
> > | +   NumericMatrix tmpMatrix(as<SEXP>(List(L)[0]));
> > | +   return wrap(tmpMatrix.ncol());
> > | + "
> > | > f <- cxxfunction(signature(L="list"), src, plugin = "Rcpp" )
> > | > f(list(matrix(1:9,3,3)))
> > | [1] 3
> >
> > Nice. The as<> cast is a good idea, it may even work with
> as<NumericMatrix>
> > which would avoid the ugly SEXP in user code ...
>
> IIRC it doesn't work because you need to "de-proxy" the returned
> element from the list before you can pass it to some instantiation of
> "as".
>
> By the way, this use of the as<SEXP> actually has a practical use.  I
> have a class C++ glmFamily which corresponds to the R "family" class
> for glm and related functions.  It is a good practice to initialize
> class data members before the body of the constructor function and it
> took me a while to work out
>
>    class glmFamily {
>    protected:
>        std::string    d_family, d_link; /**< as in the R glm family */
>                                //@{ R functions from the family, as a
> fall-back
>        Rcpp::Function d_devRes, d_linkfun, d_linkinv, d_muEta, d_variance,
> d_aic;
>                                //@}
>        Rcpp::Environment d_rho;
>    public:
>        glmFamily(Rcpp::List);
> ...
>    };
>
>    glmFamily::glmFamily(List ll)
>        : d_family(  as<std::string>(as<SEXP>(ll["family"]))),
>          d_link(    as<std::string>(as<SEXP>(ll["link"]))),
>          d_devRes(  as<SEXP>(ll["dev.resids"])),
>          d_linkfun( as<SEXP>(ll["linkfun"])),
>          d_linkinv( as<SEXP>(ll["linkinv"])),
>          d_muEta(   as<SEXP>(ll["mu.eta"])),
>          d_variance(as<SEXP>(ll["variance"])),
>          d_aic(     as<SEXP>(ll["aic"])),
>          d_rho(     d_devRes.environment()) {
>        if (!ll.inherits("family"))
>            throw std::runtime_error("glmFamily requires a list of (S3)
> class
> \"family\"");
>        if (!lnks.count("identity")) initMaps();
>    }
>



-- 
Sameer Soi

w: 215.746.2683 | c: 814.241.8585
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20120210/57dc58b2/attachment.html>


More information about the Rcpp-devel mailing list