Todavía soy bastante nuevo en la programación de R, y he leído mucho sobre cómo reemplazar los bucles for, particularmente con las funciones de aplicación, lo que ha sido realmente útil para hacer que mi código sea más eficiente. Sin embargo, en algunos de los programas que estoy tratando de crear, tengo bucles for donde cada bucle debe llevarse a cabo en orden, porque los efectos de un bucle afectan lo que sucede en el siguiente bucle, y hasta donde yo sé consciente de que esto no se puede lograr con, por ejemplo, lapply (). Un ejemplo de este tipo de for-loop:

p <- 1

for (i in 1:x) {
  p <- p + sample(c(1, 0), prob = c(p, 1), size = 1)
}

¿Hay alguna manera de reemplazar este tipo de bucle?

Gracias por su tiempo, todas!

-1
J. Pennycook 20 mar. 2017 a las 15:44

2 respuestas

La mejor respuesta

Este tipo de lógica se conoce como reducción o doblar . En consecuencia, no se resuelve con lapply (o similar), que es un ejemplo de mapeo , pero por Reduce:

p = Reduce(function (a, b) a + sample(c(1, 0), prob = c(a, 1), size = 1),
           seq_len(x), initial_value)

Tenga en cuenta que el argumento b en este caso no se usa; esto corresponde a su variable de bucle i, que tampoco se usa.

1
Konrad Rudolph 20 mar. 2017 a las 13:15

Creo que es un pequeño mito que usar lapply siempre hará que su código sea más eficiente. Puede hacer que su código sea más fácil de leer y comprender, pero no necesariamente más rápido:

> system.time(for(i in 1:10000000) x <- i )
   user  system elapsed 
  1.712   0.035   1.759 
> system.time(lapply(1:10000000, function(i) x <- i ))
   user  system elapsed 
 13.941   0.414  14.464 

En este caso, su código parece muy simple y claro. Entonces, ¿hay alguna razón para deshacerse del ciclo for?

0
user3603486user3603486 20 mar. 2017 a las 13:03