[Rcpp-devel] Idiom for accessing scalars
Dirk Eddelbuettel
edd at debian.org
Fri Jan 6 19:53:59 CET 2012
On 6 January 2012 at 10:39, John Chambers wrote:
| At the risk of derailing this thread into the quicksand of programming
| style ....
Au contraire: thanks for joining in.
| Except when required by the specific application, my preference would be
| to stay with the Rcpp idiom. Mixing in the older C API seems to risk
| more programming error. Of course, each application is different and we
| have to make decisions about efficiency (machine) vs possible
| inefficiency (human).
Couldn't agree more.
| The "Rf_" part of the API in particular is ugly and somewhat of an
| add-on forced in a few examples by the use of some common names in the
| macro files.
|
| This year in our Stanford grad course, I'm planning to push Rcpp, so in
| a few months I may have a different view. :-)
Let the bug reports roll in :)
Dirk
| Cheers,
| John
|
| On 1/6/12 10:15 AM, Dirk Eddelbuettel wrote:
| > On 6 January 2012 at 13:00, Steve Lianoglou wrote:
| > | Hi,
| > |
| > | 2012/1/6 Douglas Bates<bates at stat.wisc.edu>:
| > | [snip]
| > |> As I mentioned in another thread, I prefer the idiom
| > |>
| > |> int n2 = ::Rf_asInteger(n);
| > |>
| > |> because asInteger is part of the R API (in Rcpp it must be called as
| > |> Rf_asInteger - the :: is a hint to the compiler that it will be found
| > |> in the global namespace). Functions like asInteger and asReal are
| > |> used in thousands of places in the base R code and have been optimized
| > |> to death as well as being as general as they can possibly be.
| > |
| > | Cool ... I actually missed that tip, thanks for pointing it out again.
| >
| > And if one overcomes the "ick" factor of mixing APIs<grin>, it saves a
| > little:
| >
| > R> library(inline)
| > R> library(microbenchmark)
| > R>
| > R> fr<- cxxfunction(signature(xs="integer"), plugin="Rcpp", body='
| > + int x = ::Rf_asInteger(xs);
| > + return Rcpp::wrap(x);
| > + ')
| > R>
| > R> frcpp<- cxxfunction(signature(xs="integer"), plugin="Rcpp", body='
| > + int x = Rcpp::as<int>(xs);
| > + return Rcpp::wrap(x);
| > + ')
| > R>
| > R> microbenchmark(fr(123), frcpp(123))
| > Unit: nanoseconds
| > expr min lq median uq max
| > 1 fr(123) 841 878.5 908.5 976 15684
| > 2 frcpp(123) 976 999.5 1017.0 1085 6589
| > R>
| >
| > A good chunk here is "fixed" cost of calling a function, returning a
| > value, ... so that the "variable" gain of ::Rf_asInteger() looks pretty good.
| >
| > Dirk, somewhat wondering why we're debating 100ns gains in the context of R
| >
--
"Outside of a dog, a book is a man's best friend. Inside of a dog, it is too
dark to read." -- Groucho Marx
More information about the Rcpp-devel
mailing list