[Rcpp-devel] Testing for existence of named components
Dirk Eddelbuettel
edd at debian.org
Wed Mar 28 15:34:13 CEST 2012
On 28 March 2012 at 15:17, Ulrich Bodenhofer wrote:
| Thanks for your swift reply, Dirk! Wow, to be frank, that is not what I
| was expecting. In the meantime, I read Section 5.9.6 of "Writing R
| extensions" and I was stunned to see a solution there that is similar to
| the one you propose. I do not know R internals very well, but I cannot
| believe that accesses by names are implemented by tediously searching
| through all names sequentially. There must be some hash table behind,
| right? Otherwise, list accesses would be terribly slow. If all my
It's a trade-off: Inserting into a hash table has cost, you would enforce
that on every (!!) vector use, whether names are looked up or not.
Also, vectors are a natural representation as R's SEXP are just linear
collections.
| assumptions are right, I wonder why the R API does not make this
| mechanism available.
|
| May I add one more question: where can I find the definition of the List
| class and the implementation of its methods in the Rcpp package source
| code? I was looking for this, but got lost. Are you using the method
The only answer I can give is to ... keep looking. It's messy, because there
is so much code---but that is because Rcpp does so much stuff.
But some header files are more important than others -- and the Vector.h file
as well as the Vector/ subdirectory are important.
As mentioned, Rcpp::List() is a vector too.
| described in Section 5.9.6 of "Writing R extensions" (which I doubt) or
| something else. I would actually be quite curious to learn more about
| how lists are implemented in Rcpp.
They are just vectors, hence the linear traversal.
Dirk
| Thanks and best regards,
| Ulrich
|
|
| If so, I wonder why this mechanism has not been
|
| On 03/28/2012 02:56 PM, Dirk Eddelbuettel wrote:
| > 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