Datanalytics
Inicio > r > Eles, “casts” y el rizo del rizo de la programación eficiente (con R)

Eles, “casts” y el rizo del rizo de la programación eficiente (con R)

Ante las preguntas de alguno de mis lectores, voy a proporcionar una explicación acerca de la misteriosa L. Bueno, voy más bien a dejar que la deduzcan ellos mismos a partir de la siguiente serie de bloques de código:

a <- rep( 0, 10 )
typeof( a )
object.size( a )
 
b <- rep( 0L, 10 )
typeof( b )
object.size( b )
 
##############
 
a <- 1:10
typeof( a )
object.size( a )
 
a[1] <- 10
typeof( a )
object.size( a )
 
a <- 1:10
a[1] <- 10L
typeof( a )
object.size( a )
 
##############
 
a <- 1:10
tracemem( a )
a[1] <- 2
 
a <- 1:10
tracemem( a )
a[1] <- 2L
 
##############
 
system.time( replicate( 1e5, { a <- (1:100); a[1] <- 12  } ) )
system.time( replicate( 1e5, { a <- (1:100); a[1] <- 12L } ) )

Lectores míos, no seáis perezosos y haced, cuando menos, ?tracemem en vuestra consola. Una vez leída la página de ayuda, ¿se os ocurre algún truco para ahorrar mucha memoria cuando trabajáis con objetos (p.e., matrices) grandes de enteros?

Be Sociable, Share!
Categories: r Tags:
  1. Jose Luis
    Lunes, 16 de enero de 2012 a las 10:29 | #1

    Muy interesante, como siempre. Gracias. Me ha sorprendido que con
    a <- 1:10
    tracemen( a )
    a[1] <- 2
    se haga llamada a duplicate y sin embargo con a[1] <- 2L no .
    A partir de ahora cuando tenga que tratar con enteros y con bucles, usaré la "L".

    Saludos.

  2. Lunes, 16 de enero de 2012 a las 13:13 | #2

    No es sólo que se “duplique” el objeto. Es que se transforma internamente de entero a doble.

  3. Lunes, 16 de enero de 2012 a las 14:46 | #3

    He buscado en la ayuda de R lo explica en ?Numeric.Constants.

    An numeric constant immediately followed by L is regarded as an integer number when possible (and with a warning if it contains a “.”)

    La verdad es que había visto la L pero ni me lo había planteado ¡Que interesante! Gracias.

  4. Lunes, 16 de enero de 2012 a las 15:43 | #4

    Gracias por la explanacion. Piensaba que la ‘L’ significaba ‘levels’. He apprendido una cosa hoy.

  1. Sin trackbacks aún.