[Rcpp-devel] accessing list elements without using names

Douglas Bates bates at stat.wisc.edu
Fri Feb 10 22:47:56 CET 2012


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();
    }


More information about the Rcpp-devel mailing list