El objetivo principal de este curso es proporcionar los elementos básicos para empezar a trabajar con el lenguaje de programación R en el ámbito de la Estadística.
Este curso está basado muy especialmente en el documento
Introducción al uso y programación del sistema estadístico R
de Ramón Díaz-Uriarte de la Unidad de Bioinformática del CNIO.
La plantilla básica de una función es
Cada uno de ellos es importante.
El nombre de la función puede ser casi cualquier cosa, incluso
funciones o variables definidas previamente, así que tenga cuidado. Una
vez que haya dado el nombre, puede usarlo como cualquier otra función,
con paréntesis. Por ejemplo, para definir una función de desviación
estándar usando la función
var()
, podemos hacer
Se puede llamar sin paréntesis y así se obtiene la definición misma
## function(x) sqrt(var(x))
## [1] "hello world"
## [1] "hello fred"
Si la función hello.someone()
anterior se utiliza sin valor para el argumento, da error.
Para corregir esta situación podemos dar un valor por defecto.
## [1] "hello world"
La expresión name="world"
no
es una asignación.
Los argumentos c
y
d
tienen valores por
defecto.
Podemos especificarlos nosotros o no (i.e., usar los valores por defecto).
args(nombre.funcion)
nos
muestra los argumentos de cualquier función.
“...
” permite pasar
argumentos a otra función:
f3 <- function(x, y, label = "la x", ...){
plot(x, y, xlab = label, ...)
}
f3(1:5, 1:5)
f3(1:5, 1:5, col = "red")
outer()
. Por ejemplo:El cuerpo de la función y su valor devuelto hacen el trabajo de la función. El valor que se devuelve es lo último que se evalúa. Entonces, si solo se calcula una cosa, es fácil escribir una función.
Si la función es más complicada, entonces el cuerpo de la función
y el valor devuelto están encerrados en llaves:
{}
.
En el cuerpo, la función puede usar variables. Por lo general, estos son argumentos de la función. ¿Y si no lo son? Entonces R sale a cazar para ver qué encuentra.
En la función una.f()
“z
” es una free
variable: ¿cómo se especifica su valor?
Lexical scoping
Ver documento Frames, environments and scope in R and S-PLUS de J. Fox en y sección 10.7 en An introduction to R.
También ver
demo(scoping)
.
if(cond) expr
if(cond) cons.expr else alt.expr
for(var in seq) expr
while(cond) expr
repeat expr
break
next
expr
(también
alt.expr
) puede ser una
expresión simple o una de las llamadas expresiones compuestas,
normalmente del tipo
{expr1; expr2}
.{...}
alrededor de las
instrucciones, i.e. después de
if(...)
o
for(...)
.if (cond.logica)
instrucción else
instrucción.alternativaifelse()
es una versión
vectorizada odd.even <- function(x){
ifelse(x %% 2 == 1, "Odd", "Even")
}
mtf <- matrix(c(TRUE, FALSE, TRUE, TRUE), nrow = 2)
ifelse(mtf, 0, 1)
## [,1] [,2]
## [1,] 0 0
## [2,] 1 0
for(
variable.loop
in
valores)
instrucción## el valor de i es 1
## el valor de i es 2
## el valor de i es 3
## el valor de i es 4
## el valor de i es 5
## el valor de i es 6
## el valor de i es 7
## el valor de i es 8
## el valor de i es 9
## el valor de i es 10
continue.loop <- TRUE
x <- 0
while(continue.loop){
x <- x + 1
print(x)
if( x > 10) continue.loop <- FALSE
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 11
break
para salir de un
loop.Debugging from Advanced R de Hadley Wickham.
Cuando se produce un error,
traceback()
nos informa de la
secuencia de llamadas antes del crash de nuestra función. Es
útil cuando se producen mensajes de error incomprensibles.
Cuando se producen errores o la función da resultados incorrectos o warnings indebidos podemos seguir la ejecución de la función.
browser
interrumpe la
ejecución a partir de ese punto y permite seguir la ejecución o examinar
el entorno; con “n” paso a paso, si otra tecla sigue la ejecución
normal. “Q” para salir.
debug
es como poner un
browser
al principio de la
función y se ejecuta la función paso a paso. Se sale con “Q”.
source()
abrimos una
sesión de R y hacemossource()
es en ocasiones
más útil porque informa inmediatamente de errores en el código. BATCH no
informa, pero no requiere tener abierta una sesión (se puede correr en
el background).
Ver la ayuda:
Rcmd BATCH --help
Puede que necesitemos explícitos
print
statements o hacer
source(my.file.R, echo = TRUE)
.
sink()
es el inverso de
source()
(lo manda todo a un
fichero).
Se pueden crear paquetes, con nuestras funciones, que se comporten igual que los demás paquetes. Ver Writing R extensions.
R puede llamar código compilado en C/C++ y FORTRAN. Ver
.C
,
.Call
,
.Fortran
.
No hemos mencionado el computing on the language (ej.,
do.call
,
eval
, etc.).