Skip to content

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

20 messages · Javier Villacampa González, Fernando Fernández, Javier Marcuzzi +6 more

#
Estimado González

Si. Compilando. Yo realicé una prueba muy sencilla es es mucho más veloz, 
claro, esta posibilidad existe en la última versión de R.

Javier Marcuzzi

-----Mensaje original----- 
From: Javier Villacampa González
Sent: Tuesday, June 12, 2012 9:32 AM
To: r-help-es en r-project.org
Subject: [R-es] help: Bucles rápidos en R

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.








_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es
#
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ó:
_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es
#
Quería decir

x[x>3]<-3

casi seguro.

Respecto al "for", coincido en lo que dice Jorge: desde hace unas
cuantas versiones de R, la eficiencia de los bucles es pareja a la de
las funciones apply y similares. En tiempos, es cierto, había
diferencias importantes.

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com


El día 12 de junio de 2012 18:47, Eva Prieto Castro
<evapcastro en yahoo.es> escribió:
1 day later