[R-es] help: Bucles rápidos en R

Marcuzzi, Javier Rubén javier.ruben.marcuzzi en gmail.com
Mar Jun 12 16:58:41 CEST 2012


Estimados

No se si responde la pregunta original, pero busque el ejemplo de como 
compilar en R, utiliza algunas funciones sencillas, sin embargo nunca lo 
probé con un data.frame, aunque pienso que podría funcionar.

# a simple example
f <- function(x) x+1
fc <- cmpfun(f)
fc(2)
disassemble(fc)

# old R version of lapply
la1 <- function(X, FUN, ...) {
    FUN <- match.fun(FUN)
    if (!is.list(X))
    X <- as.list(X)
    rval <- vector("list", length(X))
    for(i in seq(along = X))
    rval[i] <- list(FUN(X[[i]], ...))
    names(rval) <- names(X)          # keep `names' !
    return(rval)
}
# a small variation
la2 <- function(X, FUN, ...) {
    FUN <- match.fun(FUN)
    if (!is.list(X))
    X <- as.list(X)
    rval <- vector("list", length(X))
    for(i in seq(along = X)) {
        v <- FUN(X[[i]], ...)
        if (is.null(v)) rval[i] <- list(v)
        else rval[[i]] <- v
    }
    names(rval) <- names(X)          # keep `names' !
    return(rval)
}
# Compiled versions
la1c <- cmpfun(la1)
la2c <- cmpfun(la2)
# some timings
x <- 1:10
y <- 1:100

system.time(for (i in 1:10000) lapply(x, is.null))
system.time(for (i in 1:10000) la1(x, is.null))
system.time(for (i in 1:10000) la1c(x, is.null))
system.time(for (i in 1:10000) la2(x, is.null))
system.time(for (i in 1:10000) la2c(x, is.null))
system.time(for (i in 1:1000) lapply(y, is.null))
system.time(for (i in 1:1000) la1(y, is.null))
system.time(for (i in 1:1000) la1c(y, is.null))
system.time(for (i in 1:1000) la2(y, is.null))
system.time(for (i in 1:1000) la2c(y, is.null))

Javier Marcuzzi

-----Mensaje original----- 
From: Fernando Fernández
Sent: Tuesday, June 12, 2012 10:19 AM
To: Javier Villacampa González
Cc: r-help-es en r-project.org
Subject: Re: [R-es] help: Bucles rápidos en R

Las funciones apply, lapply, sapply, tapply son tus amigas... También es
bastante posible que estés haciendo tareas con bucles que se pueden
escribir con instrucciones matriciales y subíndices. Del tipo:

x[x[>3]]<-3

en lugar de:

for(i in 1:length(x)){
if x[i]>3 then
x[i]<-3
}

Mi recomendacion es que antes de seguir programando te recorras los
ejemplos de dos o tres manuales diferentes que suelen tener ejemplos de
como aprovechar estas instrucciones en R (Los que puedes encontrar en CRAN
deberían servirte). Merece la pena invertir algo de tiempo en aprender a
sacarles partido.

El 12 de junio de 2012 14:32, Javier Villacampa González <
javier.villacampa.gonzalez en gmail.com> escribió:

> Buenas días a todos,
>
> una vez más os escribo para preguntaros una duda. Estoy haciendo bucles 
> con
> data frames, el problema es que al hacer bucles de esta manera el sistema
> se relentiza. He buscado por internet y en varias web te dicen que evites
> los bucles en la medida de lo posible y que intentes funcionar con c++ con
> la librería Rccp http://cran.r-project.org/web/packages/Rcpp/Rcpp.pdf.
>
> Mi preguta es
> 1 Se puede acelerar el proceso dentro de R si irme a otro lenguaje
> 2  Alguna página con ejemplitos fáciles de Rccp.
>
> Como ya veis tengo la duda a medio madurar, pero si me podeis dar un
> empujón os lo agradeceré.
>
> Un saludo y gracias por adelantado.
>
>        [[alternative HTML version deleted]]
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>

[[alternative HTML version deleted]]







_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es



Más información sobre la lista de distribución R-help-es