On 10 September 2012 at 13:55, Søren Højsgaard wrote:
| Dear list,
| 
| I want to do some operations on an array, here exemplified by taking log (the 
operations I have in mind are made using RcppArmadillo):
| 
| > pp  <- array(c(.1, .4, .4, .1), dim=c(2,2),dimnames=list(A=c("a1","a2"), 
B=c("b1","b2")))
| > log(pp)
|     B
| A            b1         b2
|   a1 -2.3025851 -0.9162907
|   a2 -0.9162907 -2.3025851
| 
| It is essential that dim and dimnames attributes are preserved. My take on 
this task is:
| 
| src <-'
|  using namespace arma;
|  using namespace Rcpp;
|  NumericVector p(pp_);
|  // Some computations using RcppArmadillo
|  vec pp = as<vec>(pp_);
|  vec aa = log(pp);
|  // Get the result back
|  NumericVector ans(p.length());
|  ans = aa;
|  // Set attributes
|  ans.attr("dim")      = p.attr("dim");
|  ans.attr("dimnames") = p.attr("dimnames");
|  return(wrap(ans));   
|  '  
| > library(inline)
| > loga <- cxxfunction(signature(pp_ = ""), src, plugin = "RcppArmadillo", 
verbose=F)
| > loga(pp)
|     B
| A            b1         b2
|   a1 -2.3025851 -0.9162907
|   a2 -0.9162907 -2.3025851
| 
| This works, but if anyone can spot a more elegant (fewer lines) way of doing 
it, I would be happy to know...

All untested and just ideas:

a) Just use Rcpp sugar if all you need is log() etc pp which is present in
   sugar; this should preserve attributes

b) First clone the source object to preserve names, dims, ...; then do
   transformation and just insert new values

c) If it walks and quacks like a Matrix, ... so use NumericMatrix which does
   have a dim attribute

Dirk

| 
| Best regards
| Søren
| 
| _______________________________________________
| 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

-- 
Dirk Eddelbuettel | e...@debian.org | http://dirk.eddelbuettel.com  
_______________________________________________
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

Reply via email to