[Rcpp-devel] basic usage help

Vinh Nguyen vinhdizzo at gmail.com
Wed May 26 20:29:04 CEST 2010

On Wed, May 26, 2010 at 10:21 AM, Romain Francois
<romain at r-enthusiasts.com> wrote:
> Le 26/05/10 18:55, Vinh Nguyen a écrit :
>> Dear Rcpp list,
>> It's time for me to finally try out Rcpp
> Great. You won't regret it ;-)

Thanks for the prompt response.  My only initial hesitation about
using Rcpp is the uncertainty in the availability of support and
development in the future.  I know .C() and .Call() will always be
available so long as R is in business (and it looks like it will be
around for the rest of my life!).  I'm not an expert in programming so
I'd hate to re-program things down the line.  However, observing the
vibe on the list and that Prof. Bates is also using it, I feel very
relieved =].  Keep up the good work!

>> since I have to do some
>> computing for my research.  Some questions (please be kind as I'm only
>> a beginner C programmer using .C() and not smart enough to understand .
>> Call()):
> This is where Rcpp comes in. It will make you forget that .Call looks silly
> and complicated. .C seems easier, but that is an illusion.
>> 1.  I plan to use objects like
>> Rcpp::NumericMatrix orig(matrix);
>> to store.  To confirm, storing to orig directly stores into the
>> original R object matrix right?
>> orig(i,j) = some double;
> Yes. Rcpp classes of the new api (e.g. Rcpp::NumericMatrix) act as a
> wrapper. They change the way you look at the R object, but not the object
> itself.
> However, if you pass a SEXP that really is an integer matrix, Rcpp will cast
> it to a numeric matrix. see the thread :
> http://permalink.gmane.org/gmane.comp.lang.r.rcpp/369 for how that might
> byte you if you are not aware of it.
>> 2.  int n = orig.rows();
>> Where can I find documentation on all the functions associated with
>> the class?  I'd like to know all the available functions plus
>> information about it (for example, the above returns an int).
> Dirk maintains a this http://dirk.eddelbuettel.com/code/rcpp/html/index.html
> generated by doxygen. Some people like it.
> The issue with classes like NumericMatrix is that they are generated from a
> template and this makes it difficult for things like doxygen to produce
> something nice. (some people don't like it)

Yea, don't see information on NumericMatrix or stuff from the "new" API.

> One approximate way is to grep around the unit tests. We do have quite a
> good coverage and we try to stress each functionality of Rcpp.
> Otherwise the source code.
>> 3.  Is there a class for multidimensional arrays?  I'm thinking of
>> array() in R.  I use something like
>> S2[i + (*nObs)*j + (*nObs)*(*nParam)*k] = ...;
>> for all vectors, matrices, and arrays in C, and this is a pain as it
>> is a souce of a lot of my errors.
> Not currently. Not that it is difficult to achieve, but it has to raise up
> on our list of priorities.

I'll stick to my single dimensional arrays then.

>> 4.  My original code is using nlm() in R to fit my model. However, I
>> think it is best to do the Newton-Raphson directly in C/C++.  Can some
>> how evaluate matrix multiplication using "%*%" in R directly in my C++
>> code (using the Rcpp::NumericMatrix class)?
> we don't currently have operators on Rcpp types. maybe some day.
> we however developped the RcppArmadillo package, which gives you the full
> power of armadillo (http://arma.sourceforge.net/) plus the convenience of
> Rcpp, at a small cost (see examples in RcppArmadillo)

At first I wanted to refrain from this since I didn't want to get too
complex as I'm learning how to use Rcpp.  However, after reviewing
your recent example more thoroughly, it doesn't seem too complicated.
To confirm, returning a colvec and matrix objects from arma is OK (R
will understand)?

>> 5.  How do I return a list in R that consists of a value, vector, and
>> matrix?  The three can be allocated in C++ or allocated prior to
>> entering C++ and passed on in .Call()?
> Something like this:
> using namespace Rcpp ; // for _
> IntegerVector z(5) ;
> NumericMatrix foo( 3, 4 );
> return List::create(
>        _["x"] = 2,
>        _["z"] = z,
>        _["foo"] = foo ) ;
> You don't need to (but you can if you want) allocate things before. I told
> you .C was only easier by illusion ;-)
> In fact, with Rcpp you don't have to care too much about allocation, etc ...
> and you can concentrate on the problem you are trying to solve rather than
> fighting with the R API.
>> 6.  How do I compile the .cpp file on the
>> command line?  I got the following based on Dirk's HPC talk but
>> getting errors on my mac os x:
> The easiest way by far is to make a package and follow the guidelines of our
> last release notes. See the section "Using Rcpp in other packages" here
> http://romainfrancois.blog.free.fr/index.php?post/2010/05/17/Rcpp-0.8.0
> The next easy way is to build on the smartness of the inline package. With
> verbose = TRUE, it will show you how to run the show:
> fx <- cppfunction( , "return R_NilValue ;", verbose = TRUE )

Ahh I see.

>> $ PKG_CPPFLAGS='r -e'Rcpp:::CxxFlags\(\)'' PKG_LIBS='r
>> -e'Rcpp:::LdFlags\(\)'' R CMD SHLIB rcpp.cpp
>> g++ -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include
>> -I/Library/Frameworks/R.framework/Resources/include/x86_64 r
>> -eRcpp:::CxxFlags() -I/usr/local/include    -fPIC  -g -O2 -c rcpp.cpp
>> -o rcpp.o
>> /bin/sh: -c: line 0: syntax error near unexpected token `('
>> /bin/sh: -c: line 0: `g++ -arch x86_64
>> -I/Library/Frameworks/R.framework/Resources/include
>> -I/Library/Frameworks/R.framework/Resources/include/x86_64 r
>> -eRcpp:::CxxFlags() -I/usr/local/include    -fPIC  -g -O2 -c rcpp.cpp
>> -o rcpp.o'
>> make: *** [rcpp.o] Error 2
>> If I get these things going then I'd be happy to release the code as
>> an example on using Rcpp to do maximization/model fitting.
> We look forward to it.
>> Thanks.
>> Vinh
> --
> Romain Francois
> Professional R Enthusiast
> +33(0) 6 28 91 30 30
> http://romainfrancois.blog.free.fr
> |- http://bit.ly/cork4b : highlight 0.1-8
> |- http://bit.ly/bklUXt : RcppArmadillo 0.2.1
> `- http://bit.ly/936ck2 : Rcpp 0.8.0

More information about the Rcpp-devel mailing list