[R] First R Package --- Advice?

Duncan Murdoch murdoch.duncan at gmail.com
Wed Feb 6 12:31:11 CET 2013


On 13-02-05 7:43 PM, ivo welch wrote:
> Dear R experts---
>
> after many years, I am planning to give in and write my first R
> package.  I want to combine my collection of collected useful utility
> routines.
>
> as my guide, I am planning to use Friedrich Leisch's "Creating R
> Packages: A Tutorial" from Sep 2009.  Is there a newer or better
> tutorial?  this one is 4 years old.
>
> I also plan on one change---given that the package.skeleton() function
> writes all the individual man[ual] functions, I am thinking it would
> be a good idea to put the doc and the R code together in the same
> file, one for each function.  Interestingly enough, the code is by
> default in the \examples{} section, so I am thinking of writing a perl
> program that takes every .Rd file and writes the function into the R/
> directory, overwriting anything else that is already there.  this way,
> I maintain only one file for each function, and the docs and code are
> together.  sort of like knuth's literate programming and the
> numerical-recipees approach to keeping each function in its own file
> with equal name.

I have heard of people using noweb to do this, but I can't point to any 
examples.  I'd actually recommend against it.  Good documentation files 
don't make good source files.

If you really want close connections between your source and the user 
documentation, I think that's the job of your IDE.  (I don't find this 
to be a problem, so I don't use an IDE that attempts this, but I believe 
they exist:  I'd look at ESS, RStudio, RKWard if I was in the market for 
that.)

Other people have recommended Roxygen, but honestly I haven't seen a 
package documented with Roxygen where the documentation was adequate.
It looks as though it's great to get initial documentation created, but 
does not appear to encourage followup.

>
> I believe my "try-out and debug cycle" will then be
>
>     $ cd iaw  ## the package name and top directory is iaw
>     $ perl weaveall.pl   ## extract all man/*.Rd files code examples
> and place them in R/
>     $ R CMD INSTALL iaw
>     $ R CMD check iaw

I wouldn't put the last step in this cycle.  Have a separate check 
cycle, which includes a build step, and checks the built tarball.


>
> good idea?  bad idea?  common?  uncommon?
>
> I do not understand the namespace mechanism yet.  I understand the
> NAMESPACE file, and I think this lists the routines that become
> visible when a later program of mine contains 'library(iaw)'.  I think
> I want to explicitly declare what packages are actually imported.
> ?importIntoEnv tells me that it is not intended to be used.  how can
> another program declare exactly what functions it wants to import?
> (frankly, I would love to turn all default autovivification off in my
> program, but that's not possible.)

I am not sure I know what you mean by "program", but the NAMESPACE file 
allows you to declare which functions you want to import from other 
packages.  I think it is not as strict as you want:  if you don't 
declare it, you might still find it, but if you do declare it, you'll 
find that version before any user-created or other-package-created one.

It might be a good idea for R to allow a package to request the strict 
declaration model, where you need to declare *every* import.  I don't 
know how difficult a change that would be.

Duncan Murdoch


>
> /iaw
> ----
> Ivo Welch (ivo.welch at gmail.com)
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list