Archive | Tips & Tricks RSS for this section

Exemples fàcils de Non standard evaluation

No sé si us heu fixat que hi ha funcions que cal passar arguments en cometes, a vegades sense, d’altres cal un vector i n’hi ha que amb el nom del camp ja n’hi ha prou.

Per entendre el que vull dir, amb un exemple serà més fàcil:

data(cars)

subset(cars, cars$speed < 10 & cars$dist < 10)

  speed dist
1     4    2
3     7    4


subset(cars, speed < 10 & dist < 10)

  speed dist
1     4    2
3     7    4

Tot i que en els dos casos obtenim el mateix resultat, la forma d’arribar és diferent. En el primer cas cal fer cars$ abans de cada camp i en el segon en tenim prou amb els noms dels camps. La funció subset fa ús en el segon cas de non standard evaluation. Si volem programar una funció que usa molts camps, pot ser pràctic utilitzar aquesta tècnica.

Amb aquesta entrada vull mostrar exemples simples de programar funcions que usen non standard evaluation. Cal tenir present que aquestes funcions estan pensades per a un ús interactiu. Per tant, si es volen incloure dins d’altres funcions, podrien sorgir complicacions o problemes.

Com tot exemple simple, serveix bàsicament per mostrar la potencialitat del mateix.

data(cars)

cars$var <- cars$speed * 2

evalVar <- function(dades, var) {

    nom_var <- deparse(substitute(var))
    resultat <- dades[, nom_var]
    resultat
}

evalVar(cars, speed)

 [1]  4  4  7  7  8  9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14
[24] 15 15 15 16 16 17 17 17 18 18 18 18 19 19 19 20 20 20 20 20 22 23 24
[47] 24 24 24 25

evalVar(cars, dist)

 [1]   2  10   4  22  16  10  18  26  34  17  28  14  20  24  28  26  34
[18]  34  46  26  36  60  80  20  26  54  32  40  32  40  50  42  56  76
[35]  84  36  46  68  32  48  52  56  64  66  54  70  92  93 120  85

evalCond <- function(dades, cond) {

    cond <- substitute(cond)
    resultat <- eval(cond, dades, parent.frame())
    resultat
}

evalCond(cars, speed + dist)

 [1]   6  14  11  29  24  19  28  36  44  28  39  26  32  36  40  39  47
[18]  47  59  40  50  74  94  35  41  69  48  56  49  57  67  60  74  94
[35] 102  55  65  87  52  68  72  76  84  88  77  94 116 117 144 110

evalCond(cars, speed + dist < var)

 [1]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[34] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[45] FALSE FALSE FALSE FALSE FALSE FALSE

evalFormula <- function(dades, form) {

    form <- as.formula(form)
    lm(form, dades)

}

evalFormula(cars, speed ~ var)


Call:
lm(formula = form, data = dades)

Coefficients:
(Intercept)          var  
   4.02e-15     5.00e-01  

evalFormula(cars, speed ~ dist)


Call:
lm(formula = form, data = dades)

Coefficients:
(Intercept)         dist  
      8.284        0.166  

Rstudio 0.98 (preview release)

He vist pel twitter que a les jornades mundials d’R, que s’han celebrat a Albacete i que m’arrepenteixo de no haver anat, han anunciat l’RStudio Preview Release 0.98.

On presenten dues novetats molt interessants:

  • R Presentations: Per fer presentacions amb html i codi R i que hi ha molta informació aquí.
  • Debugging Tools: No he trobat documentació, per això afegeixo alguns exemples de com fer-ho servir al final de l’entrada.

Altres canvis no anunciats és que millora lleugerament l’estètica, permet veure l’estructura del data.frame, ara el workspace s’anomena Enviornment segurament perquè sigui més coherent amb el debugging tools.

Utilitzar Debugging Tools

Al principi hem va costar veure com es fa ja que no he trobat documentació al respecte. Afegeixo dos exemples en que ja s’activaran els Debugging tools.

Utilitzant browser() i executant la funció, a la part de console s’afegeixen les icones next, stop i continue.

suma2 <- function(x, y) {

    browser()
    z <- x + y

    z

}

suma2(4, 5)
suma2(4, "c")

O també utilitzant options(error=browser) que s’activarà quan hi hagi un error.


options(error = browser)

suma2 <- function(x, y) {
    z <- x + y
    z
}

suma2(4, 5)
suma2(4, "c")

Tot i que són exemples simples i no es veu la potència de debuggar, crec que serveix per intuir com funciona.

Debuggar amb R havia sigut una mica rollo, crec que la proposta de l’RStudio pot ser una millora important, tot i que crec que encara falta polir una mica. Cal mencionar que altres entorns com Eclipse StatET ja tenien eines per debuggar.

Esperarem a la versió oficial 0.98 per veure tots els canvis i la documentació adequada i oficial d’utilitzar els debugging tools.

UPDATE 16-8-13: RStudio ha creat la documentació oficial d’utilitzar Debugging Tools. Podeu llegir-ho aquí.

Beamer con Knitr

La integración de Latex con R a partir de Sweave está muy bien, sin embargo cuando se trata de Beamers, Knitr tiene más flexibilidad que Sweave, de manera que esta entrada proporciona un ejemplo de cómo usar Knitr para hacer Beamers.

 

Aquí se encuentra el documento fuente del Beamer y

Aquí está el resultado en pdf

 

Se puede usar el documento fuente del Beamer como una plantilla e ir modificando los campos necesarios para obtener tu propio Beamer en pdf.

 

Importar – Exportar datos en R

Con el objetivo de hacer este post reproducible se ha hecho esta entrada. En el antiguo post están disponibles los ficheros utilizados en la presentación realizada por el RUG-BCN, sin embargo, ahora se ha intentado que esto sea más comprensible a partir de una breve explicación, antes sólo se habían proporcionado los scripts sin más, ahora se proporciona un ejemplo reproducible.

A continuación se explicará brevemente la manera de importar datos que tienen diferentes formatos a R. La importación es muy simple, por eso se hará con poco detalle. Los archivos de ayuda de R son muy completos y claros por si surge alguna duda que vaya más allá de este post.

Para reproducir los ejemplos se pueden descargar los ficheros aquí

Importación de datos

Importando archivos CSV

datos.csv <- read.csv("datos.csv", header = T)
head(datos.csv)  # así es como deben lucir los datos

##   country country.isocode year   POP    ppp  cgnp
## 1  France             FRA 2000 61137 0.9140 101.4
## 2  France             FRA 2001 61479 0.9104 101.2
## 3  France             FRA 2002 61829 0.9106 100.3
## 4  France             FRA 2003 62171 0.9080 100.6
## 5  France             FRA 2004 62534 0.8972 100.8
## 6  France             FRA 2005 62912 0.8858 100.6

sapply(datos.csv, class)  # esto es para conocer la clase de cada variable

##         country country.isocode            year             POP 
##        "factor"        "factor"       "integer"       "numeric" 
##             ppp            cgnp 
##       "numeric"       "numeric"

summary(datos.csv)  # este es un breve resumen estadístico las variables

##    country   country.isocode      year           POP       
##  France:10   ESP:10          Min.   :2000   Min.   :10559  
##  Greece:10   FRA:10          1st Qu.:2002   1st Qu.:10710  
##  Spain :10   GRC:10          Median :2004   Median :43352  
##                              Mean   :2004   Mean   :38940  
##                              3rd Qu.:2007   3rd Qu.:61742  
##                              Max.   :2009   Max.   :64420  
##       ppp             cgnp      
##  Min.   :0.697   Min.   : 96.7  
##  1st Qu.:0.709   1st Qu.: 98.3  
##  Median :0.737   Median : 99.2  
##  Mean   :0.776   Mean   : 99.3  
##  3rd Qu.:0.869   3rd Qu.:100.6  
##  Max.   :0.914   Max.   :101.4

La instrucción View(datos.csv) muestra la base de datos completa, la visualización es muy parecida a una hoja de cálculo de excel.

Read More…

Copy/Paste extern

A la “introducció a R” que vam fer ahir, en Jilber ens va explicar un truc que em va semblar molt interessant. Què hauriem de fer per copiar una taula de l’Excel (per exemple) i fer-la servir a R? Podriem guardar el fitxer en format csv i després l’obrim amb R.

Encara més interessant és copiar la informació (ctrl + c, a windows) i després executar

myDf <- read.delim(“clipboard”)

i ja!

 

Gràcies Jilber!

Aleix, RUGBCN.

Segunda sesión del Curs gratuït d’iniciació a R: Importar/Exportar datos

Ficheros de datos para desarrollar la sesión de Importar/Exportar correspondiente a la segunda sesión de curso gratuito de R organizado por los doctorandos de sociología de la UB y RUGBCN.

Image

Jilber Urbina, RUGBCN

Rprofile: Personalitzar els packages que es carreguen a l’inici

Quan inicies una sessió d’R, per defecte es carreguen un conjunt de packages. Normalment són el base, mes els següents datasets, utils, grDevices, graphics, stats i methods. Pots comprovar quins són els que se’t carreguen per defecte fent la següent instrucció:

 getOption("defaultPackages") 

Pots modificar els packages que es carreguen a l’inici d’una sessió d’R has d’anar al fitxer Rprofile que normalment es troba:

  • Library/Frameworks/R.framework/Versions/2.14/Resources/library/base/R [Mac OS X]
  • C:\Archivos de programa\R\R-2.14.1\library\base\R [Windows]
  • /usr/lib/R/library/base/R/Rprofile [Linux] (Actualització gràcies al comentari del Tim)
El fitxer Rprofile conté molts paràmetres d’inicialització que podeu adaptar-los a les vostres necessitats però per personalitzar els packages a carregar heu de buscar el codi següent:
local({dp <- as.vector(Sys.getenv("R_DEFAULT_PACKAGES"))

if(identical(dp, "")) # marginally faster to do methods last

dp <- c("datasets", "utils", "grDevices", "graphics",

"stats", "methods")

else if(identical(dp, "NULL")) dp <- character(0)

else dp <- strsplit(dp, ",")[[1]]

dp <- sub("[[:blank:]]*([[:alnum:]]+)", "\\1", dp) # strip whitespace

options(defaultPackages = dp)

})

Llavors cal modificar la línia de codi que hi ha:

 dp <- c("datasets", "utils", "grDevices", "graphics","stats", "methods") 

i la ampliem amb els packages que utilitzem habitualment, com poden ser el plyr o el ggplot2

 dp <- c("datasets", "utils", "grDevices", "graphics","stats", "methods", "plyr", "ggplot2") 

i a partir de que guardeu el fitxer i reinicieu l’R  ja els tindreu carregats plyr i ggplot 2 cada cop que inicieu l’R. Per més detalls, llegir el següent enllaç al CRAN.

PS: Algú em pot dir on està l’Rprofile en Linux? Actualitzaria el post.

Lluís Ramon, RUGBCN

%d bloggers like this: