Archivo de la etiqueta: eval

Nuestras funciones de R en menús con rpanel y svWidgets

Hoy quería acercarme a los  paquetes rpanel y svWidgets para crear ventanas y menús respectivamente. La idea es sencilla, tenemos funciones en R que empleamos habitualmente y con ellas vamos a realizar un menú. Partimos de una función muy sencilla en R para eliminar datos con valores missing. [Por cierto, que cansado estoy de escribir palabras en inglés para facilitar las búsquedas, un valor missing es un valor perdido. Tras el lapso continúo]. Mi función:

#Data frame con NAs
tmp <- as.data.frame(matrix(log(rnorm(10000,25,10)),ncol=10))
#Función que elimina missing
nomiss <- function(x) {
d1 = nrow(x)
x <- na.omit(x)
d2 = nrow(x)
cat("Se han eliminado ",d1-d2," de un total de ",d1," observaciones")
}
#Llamamos a la función
nomiss(tmp)

La idea es crear un menú para ejecutar mi función a través de ventanas. También es muy importante crear un código que me implique pocas líneas y que pueda aprobechar para otras funciones. Para la creación de ventanas vamos a Seguir leyendo Nuestras funciones de R en menús con rpanel y svWidgets

Truco R. Eval, parse y paste para automatizar código

La función paste nos permite concatenar cadenas de texto con R:

paste("Dato",rep(1:10),sep="")

Parse recoge una expresión pero no la evalúa:

parse(text="sqrt(121)")

Y por último eval evalúa una expresión:

eval(parse(text="sqrt(121)"))

Interesantes funciones que nos pueden permitir automatizar códigos recursivos o códigos guardados como objetos en R. Imaginemos el siguiente ejemplo de R:

ejemplo1 <- data.frame(replicate (20,rpois(20,10)))
nom <- paste("dato",1:20,sep="")
names(ejemplo1) <- nom
summary(ejemplo1)

Hemos automatizado los 20 nombres de un data frame con datos aleatorios con una distribución de poissón de media 10 creado con la función replicate. Ahora imaginemos que deseamos transformar en factor sólo aquellos elementos del data frame con un sufijo par (datos2, datos4, …). Podemos crear una función o podemos crear ejecuciones de código R del siguiente modo:

ejecucion <- paste("ejemplo1$dato",seq(2,20,by=2),"<-as.factor(ejemplo1$dato",
seq(2,20,by=2),")",sep="")
ejecucion
[1] "ejemplo1$dato2<-as.factor(ejemplo1$dato2)"
[2] "ejemplo1$dato4<-as.factor(ejemplo1$dato4)"
[3] "ejemplo1$dato6<-as.factor(ejemplo1$dato6)"
[4] "ejemplo1$dato8<-as.factor(ejemplo1$dato8)"
[5] "ejemplo1$dato10<-as.factor(ejemplo1$dato10)"
[6] "ejemplo1$dato12<-as.factor(ejemplo1$dato12)"
[7] "ejemplo1$dato14<-as.factor(ejemplo1$dato14)"
[8] "ejemplo1$dato16<-as.factor(ejemplo1$dato16)"
[9] "ejemplo1$dato18<-as.factor(ejemplo1$dato18)"
[10] "ejemplo1$dato20<-as.factor(ejemplo1$dato20)"

Ahora tenemos que hacer que un objeto con instrucciones se ejecuten con parse y eval:

eval(parse(text=ejecucion))
summary(ejemplo1)

Hemos transformado en factores los elementos con sufijo par. Esto puede realizarse con sapply pero merece la pena que le echéis un vistazo a este proceso, lo ejecutéis y aprendáis una forma de automatizar código. En breve tendréis otro ejemplo de uso de esta metodología muy parecida a la que empleamos cuando programamos en otros lenguajes con menos futuro que R. Saludos.