[Rcpp-devel] accessing list elements without using names
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>