[Rcpp-devel] Testing for existence of named components

Dirk Eddelbuettel edd at debian.org
Wed Mar 28 14:56:31 CEST 2012


On 28 March 2012 at 13:56, Ulrich Bodenhofer wrote:
| My question is the following: is there any way of checking in whether a
| component of an Rcpp list (or vector) with a given name exists in this list. If
| I simply try accessing a non-existing component, I get an "index out of bounds"
| error. Trying to catch a possible exception did not work either. I also browsed
| the Rcpp package source code, but unfortunately I got lost. Sorry if this has
| been addressed on this list before. At least I googled in many different ways,
| but could not find anything. Any ideas? Any help is gratefully appreciated!

Good question, and I have the suspicion that we answered that years ago on
the list before.

Here is a super-pedestrian version. It takes a list, extracts its names() --
and should probably test whether names is empty ? -- and then compares these
against a vector of tokens, returning a bool for each token:

R> 
R> suppressMessages(library(inline))
R> 
R> f <- cxxfunction(signature(ls="list", ts="character"), plugin="Rcpp", body='
+    Rcpp::List lst(ls);
+    Rcpp::CharacterVector nam = lst.names();
+    std::vector<std::string> nm = Rcpp::as< std::vector< std::string > >(nam);
+    int m = nam.size();
+ 
+    Rcpp::CharacterVector tok(ts);
+    std::vector<std::string> tk = Rcpp::as< std::vector< std::string > >(tok);
+    int n = tok.size();
+ 
+    Rcpp::LogicalVector   log(n);
+ 
+    for (int i=0; i<n; i++) {  // look at all tokens
+       log[i] = false;                   // assume false, but compare to all names
+       for (int j=0; j<m; j++) {
+          log[i] = (tk[i] == nm[j]);     // and note equality if we find it
+       }
+    }
+    return log;
+ ')
R> ll <- list(aa=1,b="b")	    ## list with names 'aa' and 'b'
R> f(ll, c("aa", "b", "c"))         ## does it contain 'a' or 'b' or 'c' ?
[1] FALSE  TRUE FALSE
R> f(ll, "c")                       ## works with scalars too
[1] FALSE
R> 

I am sure there is a much cleverer solution one could write...

Dirk

-- 
R/Finance 2012 Conference on May 11 and 12, 2012 at UIC in Chicago, IL
See agenda, registration details and more at http://www.RinFinance.com


More information about the Rcpp-devel mailing list