Todo lo que sucede en R es una llamada a una función

En serio, es así. ¿También if? Pues también. De hecho, `if`(1 == 3, print("a"), print("b")) Y eso permite, por ejemplo, que funcionen expresiones tales como a <- if (1 == 3) 4 else 5 tan útiles como poco empleadas en general. También son funciones (, { y otras que aparecen en la sección .Internal vs .Primitive del documento R Internals.

16 de marzo de 2017 · Carlos J. Gil Bellosta

Cuantiles, sí, pero ¿de qué tipo?

Porque resulta que los hay de varios tipos. En R, hasta nueve de ellos: set.seed(1234) muestra <- sort(rt(100, 3)) mis.cuantiles <- sapply(1:9, function(tipo) quantile(muestra, 0.834, type = tipo)) mis.cuantiles # 83.4% 83.4% 83.4% 83.4% 83.4% 83.4% 83.4% 83.4% 83.4% #0.9065024 0.9065024 0.8951710 0.8997036 0.9053693 0.9331290 0.9015846 0.9077920 0.9063154 Las definiciones de todos ellos pueden consultarse en Sample Quantiles in Statistical Packages. Las diferencias entre ellos, de todos modos, decrecen conforme aumenta el tamaño muestral: n.obs <- seq(100, 1e5, by = 1e3) res <- sapply(n.obs, function(n){ x <- rt(n, 3) diff(range(sapply(1:9, function(tipo) quantile(x, 0.834, type = tipo)))) }) plot(n.obs, log10(res), type = "l", xlab = "n obs", ylab = "discrepancia", main = "Diferencias entre los distintos tipos de cuantiles") ...

6 de marzo de 2017 · Carlos J. Gil Bellosta

Una mala manera de perder un par de horas

Es esta: 156.67 * 100 # 15667 as.integer(156.67 * 100) #15666 Claro, hay que leer ?as.integer para enterarte de que, en realidad, la función que quieres usar es round. Una mala manera de perder un par de horas.

7 de febrero de 2017 · Carlos J. Gil Bellosta

Que la fuerza de R también te acompañe a ti (allá a donde haya datos)

La fuerza de R siepre me acompaña allá donde tengo datos. De ello da fe la siguiente captura de pantalla de mi móvil: Si quieres que también te acompañe a ti: Instálate telegram Conecta con teleR

13 de diciembre de 2016 · Carlos J. Gil Bellosta

La regla del tres (para estimar la probabilidad de un evento todavía no observado)

Me acusan (quien lo hizo, si me lee, sabrá identificarse) de repetirme, de contar una historia dos, y sino me paran los pies, tres y más veces. Ya me pasó una vez por aquí. Espero que no me esté volviendo a suceder hoy porque habría jurado haber mencionado este asunto antes. Es el de la estimación de la probabilidad de eventos todavía no observados. Traduzco y (como no rectoreo universidad pública alguna y, por ende, no puedo permitirme el lujo de copiar sin citar) luego diré de donde: ...

30 de noviembre de 2016 · Carlos J. Gil Bellosta

R es un vago

Si creo la función foo <- function(a,b) a*a + b y la llamo mediante foo(1 + 1,3) pueden ocurrir dos cosas: o bien que R precalcule 1+1 y la función ejecute 2 * 2 + 3 o bien que la función ejecute directamente (1+1)*(1+1)+3. Pero, ¿qué es lo que hace realmente? Si escribimos f1 <- function(x){ print("Soy f1") x } f2 <- function(x){ print("Soy f2") x } foo(f1(2), f2(3)) obtenemos > foo(f1(2), f2(3)) [1] "Soy f1" [1] "Soy f2" [1] 7 lo que significa que f1 ha sido llamada una única vez. Es decir, R resuelve sus argumentos antes de aplicar la función. Pero hay más: ...

27 de junio de 2016 · Carlos J. Gil Bellosta

Cosas de R (¿que tal vez alguien sabrá explicar?)

En Twitter, leo The state of the art in statistical computing: sum(c(1, 2), na.r=F) [1] 3 sum(c(1, 2), na.r=T) [1] 4 – John Myles White (@johnmyleswhite) September 8, 2015 ¿Alguien puede explicar lo que ocurre? ¿Es tan grave como parece indicar sorna el autor del tuit?

9 de septiembre de 2015 · Carlos J. Gil Bellosta

Mejores mensajes de error con deparse + substitute

El código foo <- function(df, column.name){ if (!column.name %in% colnames(df)) stop("Column ", column.name, " not found in ", deparse(substitute(df))) mean(df$column.name) # por ejemplo } foo(iris, "petal.area") lanza el error Error in foo(iris, "petal.area") : Column petal.area not found in iris que es mucho más informativo gracias a la acción combinada de deparse + substitute. En particular, substitute evita que R resuelva el valor de df, es decir, devuelve un símbolo, la referencia a df, en lugar de su contenido. Luego, deparse transforma ese símbolo en su representación textual, en el nombre del objeto.

2 de julio de 2015 · Carlos J. Gil Bellosta

Todos contra todos

¿Cómo se suman los cuadrados de un vector de números en un paradigma tradicional de programación? Se crea un bucle que lo recorre y que guarda las sumas parciales en un acumulador. Sumamente económico en términos de memoria: apenas consume unos pocos bytes en la pila. La versión funcional de la cosa se parece más a sum(x^2), que implica generar un vector de cuadrados y dilapidar memoria. Así las cosas, en C uno tiende a recorrer y construir resultados parciales. R invita a crear estructuras de datos preprocesados y aplicar sobre ellas funciones resumen. Map y reduce, si se quiere. ...

25 de febrero de 2015 · Carlos J. Gil Bellosta

Dónde guardar los paquetes de R (en Linux, al menos)

En todos mis Linux, desde el principio de los tiempos, R guardaba los paquetes en /usr/lib/R/library /usr/lib/R/site-library (¡a veces y no sé por qué!) /usr/local/lib/R/site-library Bajo /usr/lib deberían instalarse solo aquellos que vienen de serie con la instalación de R (o que se instalan usando el sistema de actualización de paquetes de la distribución de Linux) mientras que bajo /usr/local vivirían los instalados posteriormente por el usuario (véase esto). Por supuesto, para escribir /usr/local/lib/R/site-library hacen falta permisos de superusuario y los paquetes ahí instalados están disponibles para todos los usuarios de la máquina. Pero de un tiempo a esta parte y por culpa, creo, de RStudio (tanto en versión de escritorio como de servidor), se me han comenzado a instalar paquetes en ~/R, bajo mi directorio personal. ¡Anatema! ...

21 de enero de 2015 · Carlos J. Gil Bellosta