jueves, 22 de enero de 2015

Lazy evaluation en R

R es un lenguaje funcional y a la vez tiene la característica de evaluación perezosa, es decir que no ejecuta código solo hasta que lo necesita. Parece rara esta característica pero es muy útil.

Supongamos lo siguiente:

> fx <- function() {
+     print("codigo muy costoso...")
+ }
> fx
function() {
    print("codigo muy costoso...")
}
> fx()
[1] "codigo muy costoso..."
> otraFx <- function (i, f) { if (i > 10) f() }
> otraFx(2,fx)
> otraFx(20,fx)
[1] "codigo muy costoso..."
>

Por lo tanto la función fx no se ejecuta si no es necesario, otro ejemplo:

> f <- function(x) {
  10
}
> f(stop("This is an error!"))
> [1] 10

Podemos forzar que ejecute el código, con force (que original) :

> f <- function(x) {
  force(x)
  10
}
> f(stop("This is an error!"))
#> Error in force(x): This is an error!

Una interesante característica, sin más dejo link:
http://adv-r.had.co.nz/Functions.html