[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