Francesc Carmona
fcarmona@ub.edu
Departamento de Estadstica
Universidad de Barcelona
Marzo 2013
El proceso para escribir paquetes de R se describe con todo detalle en el manual Writing R
extensions (WRE) del R Core Team y que se puede ver en el Comprehensive R Archive
Network (CRAN). Un manual ms sencillo es Creating R Packages: A Tutorial de Friedrich
Leisch. Sin embargo, en este documento se pretende concretar y hacer comprensible el
proceso de creacin de un paquete de R en el entorno Windows y para usuarios no expertos.
Aunque es posible aadir cdigo en un lenguaje de bajo nivel (como C/C++/Fortran), vamos a
centrarnos nicamente en el empaquetado de cdigo y datos en R.
R fue diseado en un entorno Unix que incluye un conjunto de herramientas como
compiladores, utilidades de programacin y rutinas de consola (text-formating routines). De
entrada Windows carece de estos componentes, de forma que deberemos descargar e instalar
algunos programas de software libre equivalentes a los de Unix.
Aunque se puede crear un paquete nicamente desde la consola de R y la consola del sistema,
es preferible utilizar un programa como RStudio que nos facilitar algunas tareas.
Porqu crear un paquete de R?
Algunas de las principales razones son:
1. En primer lugar, crear un paquete nos obligar a pulir nuestras funciones, datos y
cdigo y, sobre todo, a documentar todo el trabajo y dar ejemplos claros. Las
funciones sern ms fciles de usar y podremos utilizar el comando ? para ver detalles
de los parmetros, los resultados y ejemplos.
2. Es el modo ms elegante de compartir su trabajo. Los posibles usuarios del paquete
agradecern el esfuerzo de mejora y documentacin que requiere la creacin de un
paquete. El intercambio con los usuarios tambin favorece la mejora del cdigo.
3. Es la forma establecida para contribuir al crecimiento de R.
Instalacin de los programas que le faltan a Windows
Se necesitan las siguientes componentes:
1. Un conjunto mnimo de utilidades tipo Unix (las llamadas Rtools) de Brian Ripley y
que ahora mantiene Duncan Murdoch.
2. Algunos compiladores GNU reunidos en MinGW-w64 (necesarios nicamente si su
paquete contiene cdigo C, Fortran o C++). El compilador de Perl ya no es necesario
para nada.
1
(compilador GNU de C)
(programa TeX)
(una de las Rtools)
Para cada una, deberamos obtener una larga lista de opciones. Eso nos indica que los
programas estn listos para ser utilizados.
Si alguna instruccin falla, habr que localizar las carpetas que contienen los ejecutables
(.exe) de estas instrucciones y corregir adecuadamente la variable de entorno PATH. Para ello
haremos clic con el botn derecho del ratn en el icono de Inicio del escritorio con la
siguiente secuencia:
Panel de control Sistema y seguridad Sistema Configuracin avanzada del sistema
contenido
funciones del paquete
documentacin o ayuda
cdigo en un lenguaje de bajo nivel (opcional)
bases de datos (opcional)
Ejemplo
Vamos a crear un paquete muy sencillo con dos funciones elementales. Se trata de calcular el
intervalo de confianza y el test para la media con datos normales y varianza conocida. Las
funciones son:
IC.z.test <- function(x, sigma, conf.level=0.95){
alpha <- 1 - conf.level
z.alpha <- qnorm(1-alpha/2)
n <- length(x)
SE <- sigma/sqrt(n)
return(mean(x) + c(-1,1)*z.alpha*SE)
}
z.test <- function(x, mu=0, sigma=1){
n <- length(x)
SE <- sigma/sqrt(n)
z <- (mean(x)-mu)/SE
p.value <- (1-pnorm(abs(z)))*2
return(list(media=mean(x), z=z, p.valor=p.value))
}
La instruccin que crea el paquete, suponiendo que la carpeta C:/Rpaquetes exista, es:
> package.skeleton("miPaquete", path="C:/Rpaquetes")
Ahora podemos examinar el contenido de la carpeta miPaquete y rellenar todos los archivos
necesarios.
Paso 1 con RStudio
Para crear un nuevo paquete con RStudio utilizaremos la instruccin Create Project desde el
men Project o desde la barra de herramientas. Atencin: si estamos trabajando, eso cierra la
sesin y abre una nueva. Es mejor iniciar una sesin y crear el proyecto desde cero.
Debemos seleccionar el Type: Package, dar un nombre al paquete que ser tambin el nombre
del proyecto y el nombre de la carpeta y decirle donde crearlos (carpeta y proyecto). De
entrada nos ofrece crearlos en la carpeta por defecto o home. No en la carpeta de trabajo.
Mejor si especificamos la carpeta exacta donde se crear la carpeta del paquete o proyecto.
Tambin hay que aadir el archivo fuente con las funciones y datos que queremos incorporar
al paquete. As, cuando pulsemos el botn Create Project, se crear toda la estructura de
archivos necesaria dentro de la carpeta especificada y estaremos en disposicin de rellenar los
archivos de configuracin y documentacin del paquete.
6
Este es el conjunto mnimo de campos. Otros campos son opcionales, pero en todo caso hay
que tener mucho cuidado al rellenarlos ya que este archivo se consulta durante el proceso de
creacin del paquete.
Observemos que el nombre del paquete es el mismo que el de la carpeta y el mismo que
utilizaremos en la construccin del paquete.
La fecha al estilo yyyy-mm-dd.
Si algn campo ocupa ms de una lnea, como el campo Description, la segunda y
siguientes deben empezar por un tabulador o espacio en blanco.
Aunque no es recomendable, hemos aadido el item Encoding para utilizar el idioma propio
(castellano, cataln,...) en los archivos de ayuda. En linux sera Encoding: UTF-8.
Otras posibilidades se pueden ver en el documento de referencia Writing R extensions.
Otro archivo importante es el NAMESPACE. Sirve para cargar los paquetes o libreras que
necesita nuestro paquete y para indicar qu funciones haremos pblicas (con ayuda). Nuestro
paquete de ejemplo es tan sencillo que no lo necesita.
Paso 3: Documentacin de las funciones
Curiosamente, este es uno de los pasos ms difciles, pero irrenunciable. Si nuestra
documentacin es confusa, pobre o inexistente, el paquete no se podr utilizar. Incluso por su
creador o creadora!
La subcarpeta man contiene los archivos de documentacin (Rd) de cada uno de los objetos
utilizables del paquete. Para cada funcin de la carpeta R, debemos crear un archivo de
documentacin (con la extensin Rd) en la carpeta man. Es decir, si miFuncion.R es un
archivo de la carpeta R, debemos crear el archivo miFuncion.Rd en la carpeta man.
R utiliza un lenguaje especial para crear estos archivos de documentacin Rd. La
instalacin de R se encargar de trasladar este lenguaje genrico Rd a archivos HTML, de
texto o LaTeX, segn se necesite. Este lenguaje de documentacin tiene una semejanza
evidente con el LaTeX. En todo caso no es necesario saber LaTeX para escribir la
documentacin de nuestro paquete.
Si hemos utilizado la funcin package.skeleton(), ya tenemos una plantilla Rd para cada
funcin de nuestro paquete. Ahora debemos editar y rellenar la informacin requerida.
El lenguaje Rd consiste en una serie de instrucciones con sus correspondientes argumentos.
Cada instruccin es de la forma:
\command{arg}
Por ejemplo
\title{ este es mi ttulo }
El archivo Rd para una funcin contiene los puntos obligatorios name, alias, title,
description, usage en la cabecera y keyword en el pi, adems de los puntos opcionales
como arguments, value, details, references, seealso, examples en el cuerpo del
archivo.
Adems de los puntos obligatorios, se recomienda aadir las secciones arguments, value,
author y examples. Luego un archivo Rd tpico tiene un mnimo de 10 secciones, cada
una de las cuales empieza por su correspondiente instruccin:
9
\name{ ... }
\alias{ ... }
\title{ ... }
\description{ ... }
\usage{ ... }
\arguments{ ... }
\value{ ... }
\author{ ... }
\examples{ ... }
\keyword{ ... }
En todo caso la recomendacin es empezar con un mnimo de puntos y aadir los que
deseemos despus de depurar de errores el archivo.
Por ejemplo, a continuacin se muestra la plantilla creada para la funcin z.test() de
nuestro paquete:
\name{z.test}
\alias{z.test}
%- Also NEED an '\alias' for EACH other topic documented here.
\title{ ~~function to do ... ~~ }
\description{
~~ A concise (1-5 lines) description of what the function does. ~~
}
\usage{
z.test(x, mu = 0, sigma = 1)
}
%- maybe also 'usage' for other objects documented here.
\arguments{
\item{x}{ ~~Describe \code{x} here~~ }
\item{mu}{ ~~Describe \code{mu} here~~ }
\item{sigma}{ ~~Describe \code{sigma} here~~ }
}
\details{
~~ If necessary, more details than the description above ~~
}
\value{
~Describe the value returned
If it is a LIST, use
\item{comp1 }{Description of 'comp1'}
\item{comp2 }{Description of 'comp2'}
...
}
\references{ ~put references to the literature/web site here ~ }
\author{ ~~who you are~~ }
\note{ ~~further notes~~
~Make other sections like Warning with \section{Warning }{....} ~
}
\seealso{ ~~objects to See Also as \code{\link{help}}, ~~~ }
\examples{
##---- Should be DIRECTLY executable !! ---##-- ==> Define data, use random,
##-- or do help(data=index) for the standard data sets.
## The function is currently defined as
function(x,mu=0,sigma=1) {
10
n <- length(x)
SE <- sigma/sqrt(n)
z <- (mean(x)-mu)/SE
p.value <- (1-pnorm(abs(z)))*2
return(list(media=mean(x), z=z, p.valor=p.value))
}
}
% Add one or more standard keywords, see file 'KEYWORDS' in the
% R documentation directory.
\keyword{ ~kwd1 }
\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line
Con el \alias{} se puede utilizar el mismo documento de ayuda para varios objetos. Es el
caso de las funciones dnorm, rnorm, pnorm y qnorm.
Los ejemplos deben ser ejecutables. R comprobar durante la instalacin que los ejemplos
funcionan.
El ltimo item \keyword{} debe contener como mnimo una de las palabras clave estndar
que se pueden hallar en el archivo R_HOME/doc/KEYWORDS.db1.
Las pginas de ayuda para conjuntos de datos siguen una estructura similar y contienen los
items name, alias, doctype, title, description, usage, format, source, examples y
keyword, donde doctype viene definido como {data} y keyword como {datasets}.
Instrucciones de formato Rd
Hay un extenso conjunto de instrucciones para dar formato. Todas ellas estn descritas en el
captulo 2 de WRE. Mi recomendacin es no abusar de ellas y, a medida que se tome
confianza, leer el captulo mencionado y probarlas.
Algunas de las ms utilizadas son:
Para utilizar la fuente typewriter (especialmente para cdigo R): \code{ miFuncion }
Insertar URL: \url{ http://www.r-project.org/ }
Insertar una direccin de correo: \email{ fcarmona@ub.edu }
La instruccin \arguments usa la subinstruccin \item para organizar una lista. Si el retorno
de la funcin es una lista, tambin se necesitar usar la instruccin \item. Por ejemplo, la
funcin z.test de nuestro paquete devuelve una lista con tres items. Esto significa que en la
seccin \value deberemos insertar:
\item{media}{ valor medio de los datos muestrales }
\item{z}{ valor del estadstico para el contraste }
\item{p.valor}{ p-valor para el contraste sobre la media }
1 R_HOME puede ser algo como C:/Archivos de programa/R/R-2.15.3
11
NOTA: no debe haber espacios entre la llave } que cierra el nombre del item y la llave que
abre { el texto del argumento.
Depuracin de un documento Rd
Los mensajes de error de R para los archivos de documentacin pueden ser muy crpticos. Por
ello es conveniente tener mucho cuidado en los detalles de su redaccin.
Peter Rossi (2006) da las siguientes recomendaciones:
Hay dos ideas fundamentales:
1. Crear el archivo Rd de forma incremental. Es decir, no escribir un archivo completo
a la primera. Se puede empezar con un archivo simple y probar los cambios uno a uno.
2. Trabajar con una nica funcin cada vez. Resistir la tentacin de escribir el paquete
completo y todos sus archivos Rd y esperar que el depurado conjunto funcione.
No es una buena idea ejecutar la instruccin R CMD check para chequear los archivos Rd al
principio. Es mejor usar R CMD Rd2txt primero. Si tenemos un archivo de documentacin,
mifun.Rd, se puede utilizar la siguiente instruccin en la consola:
R CMD Rd2txt mifun.Rd
que producir la versin html. Entonces se puede abrir el archivo creado con su navegador
preferido. Inspeccione el resultado para ver si todas las secciones definidas se muestran
correctamente.
Claves para redactar archivos Rd:
1. Como en TeX/LaTeX, el formateador Rd tiene sus propias ideas sobre cmo debe
quedar un documento. No intente modificar el resultado demasiado, por ejemplo con
\cr (nueva lnea). Inserte una lnea en blanco para separar grupos de texto.
2. No olvide que % es el smbolo de comentario en los archivos Rd (como # lo es en
las funciones R).
Esto significa que debe tener cuidado con la multiplicacin de matrices en un ejemplo.
Utilice el carcter de escape \ para insertar %, como en C = A\%*\%B.
3. Evite los carcteres $, #, _, <, > y |.
4. No olvide cerrar las llaves { }. Lo mejor es utilizar un editor que facilite este tema.
5. La inclusin de ecuaciones en LaTeX es ms un problema que una solucin,
especialmente si tenemos en cuenta que los documentos presentados con la ayuda
(instruccin help o ?) son versiones en texto llano. Las ecuaciones LaTeX no se
traducen muy bien a texto. Esto se puede evitar con alguna alternativa, como un enlace
a un archivo PDF.
6. El procesador Rd es muy sensible a los espacios entre la instruccin y el principio del
argumento. Por ejemplo:
12
\author{Francesc Carmona}
7. Si
tiene
un
conjunto
\code{\link{nombre_funcion}}
de
funciones
relacionadas,
utilice
para insertar enlaces entre los diversos archivos de
documentacin.
Para aadir objetos a un paquete que se va a crear
Si queremos aadir objetos, como un conjunto de datos o una nueva funcin, a una estructura
de paquete ya creada, deberemos gravar los objetos mismos y sus archivos de documentacin
en las carpetas apropiadas.
Gravar un conjunto de datos se puede hacer con la instruccin save(). Los nombres de los
objetos a gravar se ponen como primer argumento. En el argumento file se debe especificar
la carpeta donde dejaremos los objetos. Por ejemplo, si queremos aadir un data.frame
datos, se gravar como Rda con la instruccin
> save(datos, file=C:/Rpaquetes/miPaquete/data/datos.Rda)
El cdigo R se debe gravar con la funcin dump(). Por ejemplo, para gravar una funcin de
nombre nuevo.test hacemos
> dump("nuevo.test", file="C:/Rpaquetes/miPaquete/R/nuevo.test.R")
2 En una instalacin inicial con MikTeX se produjo un error inesperado con la fuente inconsolata. Ver la
solucin al final de este documento.
14
Para obtener el arhivo zip del paquete bastar con comprimir en este formato el paquete
Windows que ya est instalado en nuestro ordenador en la carpeta R_HOME/library. Al
nombre del archivo le podemos aadir el nmero de versin: miPaquete-1.0.zip.
Si hemos creado un paquete en Linux y queremos distribuirlo a usuarios Windows podemos
utilizar el servicio del CRAN (http://win-builder.r-project.org/) y en concreto la pgina:
http://win-builder.r-project.org/upload.aspx
Paso 6 con RStudio
Con el icono More de la Figura 5 se despliega un men que permite crear el paquete en la
versin zip en Windows con la opcin Build Binary Package.
Cmo escribir vignettes para un paquete
Adems de los archivos de documentacin en el formato Rd, R tambin permite incluir
archivos en otros formatos. Estos archivos se deben situar en la subcarpeta inst/doc del
paquete a crear. Su contenido se copiar en la subcarpeta doc cuando se instale el nuevo
paquete. En realidad los archivos se pueden escribir en cualquier formato, pero se recomienda
encarecidamente que sea en PDF.
Un caso realmente especial son los documentos en formato Sweave, los que llamaremos
package vignettes. Los documentos Sweave permiten integrar cdigo R en archivos LaTeX,
de forma que cuando se procesan se consigue un documento definitivo con los resultados del
cdigo R incrustados, tanto numricos, como grficos. Los documentos Sweave para un
paquete a crear se situarn tambin la carpeta inst/doc y se prueban con la instruccin R CMD
check (excepto las partes con eval=FALSE). La carpeta de trabajo para las pruebas es la
carpeta doc del paquete instalado, de forma que debemos asegurarnos que la carpeta
inst/doc contiene todo lo necesario.
La instruccin R CMD build se encarga de ejecutar los archivos Sweave y obtener sus
correspondientes PDF. Sin embargo, se pueden dejar las versiones PDF en la subcarpeta
inst/doc para que no se necesite su compilacin durante la instalacin. En todo caso, como
15
Bibliografa
R Core Team (2012). Writing R extensions
Rossi, P.(2006). Making R Packages Under Windows: A Tutorial.
Leisch, F. (2009). Creating R Packages: A Tutorial.
Falcon, S. and Gentleman, R (2006). Lab: Writing packages in R.
16