[Rcpp-devel] Fwd: Re: devtools load_all() and modules

Dirk Eddelbuettel edd at debian.org
Wed Mar 21 13:27:50 CET 2012


Hi Glenn,

On 21 March 2012 at 10:56, Glenn Lawyer wrote:
| Dear Dirk,
| 
| I have now written a patch which incorporates your answer to Hadley in the
| Rcpp-package manual. I am attaching the complete *Rnw file. The diff is below.

I wonder if that should go to the Rcpp-FAQ instead of Rcpp-package?
 
| Please let me know your preferred channel for me to submit future patch
| suggestions.

Posting here is perfect. No need to post the full file, and 'diff -u' output
is usually best for patches.
 
| Kind regards,
| 
| +glenn
| 
| ########## begin diff output ##################
| 
| 233,244d232
| <
| < \subsubsection{\proglang{C++} development workflow}
| < \proglang{R}'s package framework elegantly supports rapid prototyping and
| experimental code development. One suggested workflow tests changes to \
| proglange{C++} code via
| < <<echo=FALSE>>=
| <  $ R CMD INSTALL mypkg && r -lmypkg -e 'someFunctionToTickle(3.14)'
| < @
| < 
| < The second command calls 'r' (littler), not 'R'. Littler is an alternative
| front end to GNU R for '#!' (hashbang) scripting. It has fast start-up times
| and gives a guaranteed clean slate. The -l option calls 'library(mypkg)' before
| executing the \proglang{R} expression. Littler is available via most Linux

Is it really?  I do know about Debian and Ubuntu (and their derivatives) only.

| distribution's package management systems. The project homepage is \href{http:/
| /code.google.com/p/littler/.}

Or is it http://dirk.eddelbuettel.com/code/littler/ ?

Need to talk about Rscript too, of course.

Good start though.  Should add this somewhere...

Dirk

| < Alternately, rapid prototyping can be conducted  using the inline package and
| \Sexpr{cxxfunction}.
| <
| <
| 
| ########## end diff output ##################
| 
| 
| 
| -------- Original Message --------
| Subject: Re: [Rcpp-devel] devtools load_all() and modules
|    Date: Tue, 20 Mar 2012 12:38:37 -0500
|    From: Dirk Eddelbuettel <edd at debian.org>
|      To: Hadley Wickham <hadley at rice.edu>
|      CC: rcpp-devel at r-forge.wu-wien.ac.at
| 
| 
| 
| On 20 March 2012 at 12:22, Hadley Wickham wrote:
| | > For usage beyond what we document and test, you're on your own.  If you want
| | > to explore usage with devtools and other means, go for it.
| | >
| | > But I will be unlikely to have time to work this out for you, unfortunately.
| |
| | Let me flip this around on you - when you're developing a package that
| | uses Rcpp, could you outline your workflow?  After modifying your R
| | and C++ code, what sequence of steps do you take so that you can try
| | out the code in an R session?  It would be really useful to hear what
| | workflow that you (and others) find most helpful.
| 
| Sure, very valid question.  I tend to do two things:
| 
|  a) at times experiment/try/play with the inline package and cxxfunction
| 
|  b) much more often, work with a package where, for force of habit, my
|     typical workflow often is
| 
|         $ R CMD INSTALL mypkg && r -lmypkg -e 'someFunctionToTickle(3.14)'
| 
|     which does a 'library(mypkg)' for me (which is how r resolves the -l
|     arguments) and then executes the R expression
| 
| as I never got really happy with any of the unloading attempts. Littler's r
| starts very quickly and gives me a guaranteed clean slate, so I tend to work
| from there.
| 
| Dirk
| 
| --
| "Outside of a dog, a book is a man's best friend. Inside of a dog, it is too
| dark to read." -- Groucho Marx
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
| 
| 
| ----------------------------------------------------------------------
| \documentclass[10pt]{article}
| %\VignetteIndexEntry{Rcpp-package}
| \usepackage{vmargin}
| \setmargrb{0.75in}{0.75in}{0.75in}{0.75in}
| \usepackage{color,alltt}
| \usepackage[authoryear,round,longnamesfirst]{natbib}
| 
| \usepackage[colorlinks]{hyperref}
| \definecolor{link}{rgb}{0,0,0.3}	%% next few lines courtesy of RJournal.sty
| \hypersetup{
|     colorlinks,%
|     citecolor=link,%
|     filecolor=link,%
|     linkcolor=link,%
|     urlcolor=link
| }
| 
| \newcommand{\proglang}[1]{\textsf{#1}}
| \newcommand{\pkg}[1]{{\fontseries{b}\selectfont #1}}
| 
| %% defined as a stop-gap measure til interaction with highlight is sorted out
| \newcommand{\hlboxlessthan}{   \hlnormalsizeboxlessthan}
| \newcommand{\hlboxgreaterthan}{\hlnormalsizeboxgreaterthan}
| \newcommand{\hlboxopenbrace}{  \hlnormalsizeboxopenbrace}
| \newcommand{\hlboxclosebrace}{ \hlnormalsizeboxclosebrace}
| \newcommand{\hlboxbacktick}{   \hlnormalsizeboxbacktick}
| \newcommand{\hlboxunderscore}{ \hlnormalsizeboxunderscore}
| 
| <<echo=FALSE,print=FALSE>>=
| prettyVersion <- packageDescription("Rcpp")$Version
| prettyDate <- format(Sys.Date(), "%B %e, %Y")
| @
| 
| \author{Dirk Eddelbuettel \and Romain Fran\c{c}ois}
| \title{Writing a package that uses \pkg{Rcpp} }
| \date{\pkg{Rcpp} version \Sexpr{prettyVersion} as of \Sexpr{prettyDate}}
| 
| <<echo=FALSE>>=
| require( Rcpp )
| link <- function( f, package, text = f, root = "http://finzi.psych.upenn.edu/R/library/" ){
| 	h <- if( missing(package) ) {
| 		as.character( help( f ) )
| 	} else {
| 		as.character( help( f, package = paste( package, sep = "" ) ) )
| 	}
| 	if( ! length(h) ){
| 		sprintf( "\\\\textbf{%s}", f )
| 	} else {
| 		rx <- "^.*/([^/]*?)/help/(.*?)$"
| 		package <- sub( rx, "\\1", h, perl = TRUE )
| 		page <- sub( rx, "\\2", h, perl = TRUE )
| 		sprintf( "\\\\href{%s%s/html/%s.html}{\\\\texttt{%s}}", root, package, page, text )
| 	}
| }
| linkS4class <- function( cl, package, text = cl, root = "http://finzi.psych.upenn.edu/R/library/" ){
| 	link( sprintf("%s-class", cl), package, text, root )
| }
| @
| 
| \begin{document}
| \maketitle
| 
| \abstract{
|   \noindent This document provides a short overview of how to use
|   \pkg{Rcpp}~\citep{CRAN:Rcpp,JSS:Rcpp} when writing an \proglang{R} package.  It
|   shows how usage of the function \Sexpr{link("Rcpp.package.skeleton")}
|   which creates a complete and self-sufficient example package using
|   \pkg{Rcpp}. All components of the directory tree created by
|   \Sexpr{link("Rcpp.package.skeleton")} are discussed in detail.  This
|   document thereby complements the \textsl{Writing R Extensions}
|   manual~\citep{R:Extensions} which is the authoritative source on how to extend
|   \proglang{R} in general.
| }
| 
| \section{Introduction}
| 
| \pkg{Rcpp}~\citep{CRAN:Rcpp,JSS:Rcpp} is an extension package for \proglang{R} which
| offers an easy-to-use yet featureful interface between \proglang{C++} and
| \proglang{R}.  However, it is somewhat different from a traditional
| \proglang{R} package because its key component is a \proglang{C++} library. A
| client package that wants to make use of the \pkg{Rcpp} features must link
| against the library provided by \pkg{Rcpp}.
| 
| It should be noted that \proglang{R} has only limited support for
| \proglang{C(++)}-level dependencies between packages~\citep{R:Extensions}. The
| \texttt{LinkingTo} declaration in the package \texttt{DESCRIPTION} file
| allows the client package to retrieve the headers of the target package (here
| \pkg{Rcpp}), but support for linking against a library is not provided by
| \proglang{R} and has to be added manually.
| 
| This document follows the steps of the \Sexpr{link("Rcpp.package.skeleton")}
| function to illustrate a recommended way of using \pkg{Rcpp} from a client
| package. We illustrate this using a simple \proglang{C++} function
| which will be called by an \proglang{R} function.
| 
| We strongly encourage the reader to become familiar with the material in the
| \textsl{Writing R Extensions} manual~\citep{R:Extensions}, as well as with other
| documents on \proglang{R} package creation such as \cite{Leisch:2008:Tutorial}. Given
| a basic understanding of how to create \proglang{R} package, the present
| document aims to provide the additional information on how to use \pkg{Rcpp}
| in such add-on packages.
| 
| \section{Using \texttt{Rcpp.package.skeleton}}
| 
| \subsection{Overview}
| 
| \pkg{Rcpp} provides a function \Sexpr{link("Rcpp.package.skeleton")}, modeled
| after the base \proglang{R} function \Sexpr{link("package.skeleton")}, which
| facilitates creation of a skeleton package using \pkg{Rcpp}.
| 
| \Sexpr{link("Rcpp.package.skeleton")} has a number of arguments documented on
| its help page (and similar to those of \Sexpr{link("package.skeleton")}). The
| main argument is the first one which provides the name of the package one
| aims to create by invoking the function.  An illustration of a call using an
| argument \texttt{mypackage} is provided below.
| 
| <<echo=FALSE>>=
| here <- getwd()
| gendir <- tempfile()
| dir.create( gendir )
| setwd( gendir )
| Rcpp.package.skeleton( "mypackage" )
| dir.create( tlib <- tempfile() )
| system( sprintf( 'R CMD INSTALL --library="%s" mypackage ', tlib ) )
| require( "mypackage", lib.loc = tlib )
| @
| 
| % <<>>=
| % Rcpp.package.skeleton( "mypackage" )
| % writeLines( system( "tree" , intern = TRUE ) )
| % @
| \begin{Hchunk}
| \begin{Hinput}
| \ttfamily\noindent
| \hlprompt{\usebox{\hlboxgreaterthan}{\ }}\hlfunctioncall{Rcpp.package.skeleton}\hlkeyword{(}{\ }\hlstring{"mypackage"}{\ }\hlkeyword{)}\mbox{}
| \normalfont
| 
| \end{Hinput}
| 
| \begin{Hinput}
| \ttfamily\noindent
| \hlprompt{\usebox{\hlboxgreaterthan}{\ }}\hlfunctioncall{writeLines}\hlkeyword{(}{\ }\hlfunctioncall{system}\hlkeyword{(}{\ }\hlstring{"tree"}\hlkeyword{,}{\ }\hlargument{intern}{\ }\hlargument{=}{\ }\hlnumber{TRUE}{\ }\hlkeyword{)}{\ }\hlkeyword{)}\mbox{}
| \normalfont
| \end{Hinput}
| 
| \begin{Houtput}
| \ttfamily\noindent
| .\hspace*{\fill}\\
| \hlstd{}\usebox{\hlboxbacktick}--{\ }mypackage\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }|--{\ }DESCRIPTION\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }|--{\ }NAMESPACE\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }|--{\ }R\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }|{\ }{\ }{\ }\usebox{\hlboxbacktick}--{\ }rcpp\usebox{\hlboxunderscore}hello\usebox{\hlboxunderscore}world.R\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }|--{\ }Read-and-delete-me\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }|--{\ }man\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }|{\ }{\ }{\ }|--{\ }mypackage-package.Rd\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }|{\ }{\ }{\ }\usebox{\hlboxbacktick}--{\ }rcpp\usebox{\hlboxunderscore}hello\usebox{\hlboxunderscore}world.Rd\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }\usebox{\hlboxbacktick}--{\ }src\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }{\ }{\ }{\ }{\ }|--{\ }Makevars\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }{\ }{\ }{\ }{\ }|--{\ }Makevars.win\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }{\ }{\ }{\ }{\ }|--{\ }rcpp\usebox{\hlboxunderscore}hello\usebox{\hlboxunderscore}world.cpp\hspace*{\fill}\\
| \hlstd{}{\ }{\ }{\ }{\ }{\ }{\ }{\ }{\ }\usebox{\hlboxbacktick}--{\ }rcpp\usebox{\hlboxunderscore}hello\usebox{\hlboxunderscore}world.h\hspace*{\fill}\\
| \hlstd{}\hspace*{\fill}\\
| \hlstd{}4{\ }directories,{\ }10{\ }files\hspace*{\fill}\\
| \hlstd{}\mbox{}
| \normalfont
| \end{Houtput}
| \end{Hchunk}
| 
| Using \Sexpr{link("Rcpp.package.skeleton")} is by far the simplest approach
| as it fulfills two roles. It creates the complete set of files needed for a
| package, and it also includes the different components needed for using
| \pkg{Rcpp} that we discuss in the following sections.
| 
| \subsection{\proglang{R} code}
| 
| The skeleton contains an example \proglang{R} function
| \texttt{rcpp\_hello\_world} that uses the \Sexpr{link(".Call")} interface to
| invoke the \proglang{C++} function \texttt{rcpp\_hello\_world} from the
| package \texttt{mypackage}.
| 
| <<echo=FALSE,results=tex>>=
| highlight( 
|     file.path( gendir, "mypackage", "R", "rcpp_hello_world.R" ), 
|     renderer = renderer_latex( doc = FALSE )
|     )
| @
| 
| \pkg{Rcpp} uses the \Sexpr{link(".Call")} calling convention as it allows
| transport of actual \proglang{R} objects back and forth between the
| \proglang{R} side and the \proglang{C++} side. \proglang{R} objects
| (\texttt{SEXP}) can be conveniently manipulated using the \pkg{Rcpp} API.
| 
| Note that in this example, no arguments were passed from \proglang{R} down to
| the \proglang{C++} layer.  Doing so is straightforward (and one of the key
| features of \pkg{Rcpp}) but not central to our discussion of the package
| creation mechanics.
| 
| \subsection{\proglang{C++} code}
| 
| The \proglang{C++} function is declared in the \texttt{rcpp\_hello\_world.h}
| header file:
| 
| <<echo=FALSE,results=tex>>=
| external_highlight( 
|     file.path( gendir, "mypackage", "src", "rcpp_hello_world.h" ),
|     type = "LATEX", 
|     doc = FALSE
|     )
| @
| 
| The header includes the \texttt{Rcpp.h} file, which is the only file that
| needs to be included to use \pkg{Rcpp}. The function is then implemented in
| the \texttt{rcpp\_hello\_world.cpp} file
| 
| <<echo=FALSE,results=tex>>=
| external_highlight( 
|     file.path( gendir, "mypackage", "src", "rcpp_hello_world.cpp" ), 
|     type = "LATEX", 
|     doc = FALSE
| )
| @
| 
| The function creates an \proglang{R} list that contains a
| \Sexpr{link("character")} vector and a \Sexpr{link("numeric")} vector using \pkg{Rcpp}
| classes. At the \proglang{R} level, we will therefore receive a list of
| length two containing these two vectors:
| 
| <<>>=
| rcpp_hello_world( )
| @
| 
| 
| \subsubsection{\proglang{C++} development workflow}
| \proglang{R}'s package framework elegantly supports rapid prototyping and experimental code development. One suggested workflow tests changes to \proglange{C++} code via
| <<echo=FALSE>>=
|  $ R CMD INSTALL mypkg && r -lmypkg -e 'someFunctionToTickle(3.14)'
| @
|  
| The second command calls 'r' (littler), not 'R'. Littler is an alternative front end to GNU R for '#!' (hashbang) scripting. It has fast start-up times and gives a guaranteed clean slate. The -l option calls 'library(mypkg)' before executing the \proglang{R} expression. Littler is available via most Linux distribution's package management systems. The project homepage is \href{http://code.google.com/p/littler/.}
| 
| Alternately, rapid prototyping can be conducted  using the inline package and \Sexpr{cxxfunction}.
| 
| 
| \subsection{\texttt{DESCRIPTION}}
| 
| The skeleton generates an appropriate \texttt{DESCRIPTION} file, using
| both \texttt{Depends:} and \texttt{LinkingTo} for \pkg{Rcpp}:
| 
| <<echo=FALSE,results=tex>>=
| local({
| 	tf <- sprintf( "%s.make", tempfile() )
| 	file.copy( file.path( gendir, "mypackage", "DESCRIPTION" ), tf )
| 	external_highlight( tf, type = "LATEX", doc = FALSE )
| 	unlink( tf )
| })
| @
| 
| \Sexpr{link("Rcpp.package.skeleton")} adds the three last lines to the
| \texttt{DESCRIPTION} file generated by \Sexpr{link("package.skeleton")}.
| 
| The \texttt{Depends} declaration indicates \proglang{R}-level dependency
| between the client package and \pkg{Rcpp}. The \texttt{LinkingTo} declaration
| indicates that the client package needs to use header files exposed by
| \pkg{Rcpp}.
| 
| \subsection{\texttt{Makevars} and \texttt{Makevars.win}}
| 
| Unfortunately, the \texttt{LinkingTo} declaration in itself is not
| enough to link to the user \proglang{C++} library of \pkg{Rcpp}. Until more
| explicit support for libraries is added to \proglang{R}, we need to manually
| add the \pkg{Rcpp} library to the \texttt{PKG\_LIBS} variable in the
| \texttt{Makevars} and \texttt{Makevars.win} files. \pkg{Rcpp} provides the
| unexported function \texttt{Rcpp:::LdFlags()} to ease the process:
| 
| <<echo=FALSE,results=tex>>=
| local({
| 	tf <- sprintf( "%s.make", tempfile() )
| 	file.copy( file.path( gendir, "mypackage", "src", "Makevars" ), tf )
| 	external_highlight( tf, type = "LATEX", doc = FALSE )
| 	unlink( tf )
| })
| @
| 
| The \texttt{Makevars.win} is the equivalent, targeting windows.
| 
| <<echo=FALSE,results=tex>>=
| local({
| 	tf <- sprintf( "%s.make", tempfile() )
| 	file.copy( file.path( gendir, "mypackage", "src", "Makevars.win" ), tf )
| 	external_highlight( tf, type = "LATEX", doc = FALSE )
| 	unlink( tf )
| })
| @
| 
| \subsection{\texttt{NAMESPACE}}
| 
| The \Sexpr{link("Rcpp.package.skeleton")} function also creates a file
| \texttt{NAMESPACE}.
| 
| <<echo=FALSE,results=tex>>=
| local({
| 	tf <- sprintf( "%s.make", tempfile() )
| 	file.copy( file.path( gendir, "mypackage", "NAMESPACE" ), tf )
| 	external_highlight( tf, type = "LATEX", doc = FALSE )
| 	unlink( tf )
| })
| @
| 
| This file serves two purposes. First, it ensure that the dynamic library
| contained in the package we are creating via
| \Sexpr{link("Rcpp.package.skeleton")} will be loaded and thereby made
| available to the newly created \proglang{R} package. Second, it declares
| which functions should be globally visible from the namespace of this
| package.  As a reasonable default, we export all functions.
| 
| \subsection{Help files}
| 
| Also created is a directory \texttt{man} containing two help files. One is
| for the package itself, the other for the (single) \proglang{R} function
| being provided and exported.
| 
| The \textsl{Writing R Extensions} manual~\citep{R:Extensions} provides the complete
| documentation on how to create suitable content for help files.
| 
| \subsubsection{\texttt{mypackage-package.Rd}}
| 
| The help file \texttt{mypackage-package.Rd} can be used to describe
| the new package.
| 
| <<echo=FALSE,results=tex>>=
| local({
| 	tf <- sprintf( "%s.make", tempfile() )
| 	file.copy( file.path( gendir, "mypackage", "man", "mypackage-package.Rd" ), tf )
| 	external_highlight( tf, type = "LATEX", doc = FALSE )
| 	unlink( tf )
| })
| @
| 
| 
| \subsubsection{\texttt{rcpp\_hello\_world.Rd}}
| 
| The help file \texttt{rcpp\_hello\_world.Rd} serves as documentation for the
| example \proglang{R} function.
| 
| <<echo=FALSE,results=tex>>=
| local({
| 	tf <- sprintf( "%s.make", tempfile() )
| 	file.copy( file.path( gendir, "mypackage", "man", "rcpp_hello_world.Rd" ), tf )
| 	external_highlight( tf, type = "LATEX", doc = FALSE )
| 	unlink( tf )
| })
| @
| 
| 
| \section{Further examples}
| 
| The canonical example of a package that uses \pkg{Rcpp} is the
| \pkg{RcppExamples} \citep{CRAN:RcppExamples} package. \pkg{RcppExamples}
| contains various examples of using \pkg{Rcpp} using both the extended
| (``new'') API and the older (``classic'') API.  Hence, the \pkg{RcppExamples}
| package is provided as a template for employing \pkg{Rcpp} in packages.
| 
| Other CRAN packages using the \pkg{Rcpp} package are \pkg{RcppArmadillo}
| \citep{CRAN:RcppArmadillo}, \pkg{highlight} \citep{CRAN:highlight},
| and \pkg{minqa} \citep{CRAN:minqa} all of which follow precisely the guidelines
| of this document. Several other packages follow older (but still supported
| and appropriate) instructions. They can serve examples on how to get data to
| and from \proglang{C++} routines, but should not be considered templates for
| how to connect to \pkg{Rcpp}. The full list of packages using \pkg{Rcpp} can
| be found at the \href{http://CRAN.R-project.org/package=Rcpp}{CRAN page} of
| \pkg{Rcpp}.
| 
| \section{Other compilers}
| 
| Less experienced \proglang{R} users on the Windows platform frequently ask
| about using \pkg{Rcpp} with the Visual Studio toolchain.  That is simply not
| possible as \proglang{R} is built with the \pkg{gcc} compiler. Different
| compilers have different linking conventions. These conventions are
| particularly hairy when it comes to using \proglang{C++}.  In short, it is
| not possible to simply drop sources (or header files) from \pkg{Rcpp} into a
| \proglang{C++} project built with Visual Studio, and this note makes no
| attempt at claiming otherwise.
| 
| \pkg{Rcpp} is fully usable on Windows provided the standard Windows
| toolchain for \proglang{R} is used. See the \textsl{Writing R Extensions}
| manual~\citep{R:Extensions} for details.
| 
| \section{Summary}
| 
| This document described how to use the \pkg{Rcpp} package for \proglang{R}
| and \proglang{C++} integration when writing an \proglang{R} extension
| package. The use of the \Sexpr{link("Rcpp.package.skeleton")} was shown in
| detail, and references to further examples were provided.
| 
| \bibliographystyle{plainnat}
| \bibliography{Rcpp}
| 
| \end{document}
| 

-- 
"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