2017-03-09 39 views
6

Próbuję zrozumieć, jak leniwe oceny w R działa. Czy dotyczy to tylko oceny argumentów funkcji? Ponieważ to rozumiem, np.Zrozumienie leniwe oceny w R

f <- function(x = x, y = x*2) { 
    c(x, y) 
} 

f(2) 
[1] 2 4 

Ale w innych językach, np. Haskell, leniwy ewaluacja oznacza, że ​​wywołanie funkcji jest oceniane tylko wtedy, gdy jest faktycznie używane. Więc chciałbym się spodziewać czegoś jak to uruchomić w jednej chwili:

g <- function(x) { 
    y <- sample(1:100000000) 
    return(x) 
} 

g(4) 

Ale to jasno ocenia wezwanie sample chociaż jego wynik nie przyzwyczaić.

Czy ktoś może wyjaśnić dokładnie, jak to działa, lub wskazać mi kierunek, w którym zostało to szczegółowo wyjaśnione?

Podobne pytania:

Question with similar wording, but different problem

Odpowiedz

7

Jak już odkryli, R nie używa oceny leniwy w ogólnym tego słowa znaczeniu. Ale R nie zapewnia tę funkcjonalność, jeśli jest to potrzebne, przez funkcję delayedAssign() jak pokazano poniżej:

> system.time(y <- sample(1E8)) 
    user system elapsed 
    7.636 0.128 7.766 
> system.time(length(y)) 
    user system elapsed 
     0  0  0 
system.time(delayedAssign("x", sample(1E8))) 
    user system elapsed 
    0.000 0.000 0.001 
> system.time(length(x)) 
    user system elapsed 
    7.680 0.096 7.777 

Jak widać, y natychmiast oceniane, tak aby określić długość y bierze w ogóle czasu. x z drugiej strony, nie jest oceniany, gdy jest tworzony, tylko obietnica oceny x jest zwracana przez , i tylko wtedy, gdy rzeczywiście potrzebujemy wartości x, w tym przypadku w celu ustalenia jej długości, jest oceniany x.

Nie ma znaczenia, czy wyrażenie jest umieszczone w funkcji, czy wykonane w środowisku globalnym, więc enkapsulacja wyrażenia w funkcji, która została wykonana w przykładzie, tak naprawdę niczego nie dodaje, dlatego został wykluczony to. Ale jeśli chcesz mieć pewność, spróbuj:

a.f <- function(z) { delayedAssign("x", sample(1E8)); return(z+1) } 
system.time(a.f(0)) 
    user system elapsed 
     0  0  0 
+0

Mam na myśli książki Hadley Wickhama, gdzie jest mowa o: „Domyślnie, argumenty funkcji R są leniwi, są one tylko ocenić, czy stosowane właściwie”. Czy nie jest to prawdą w przypadku najnowszych wersji? – Sarang

+0

Należy zauważyć, że pytanie zawierało zdanie "Czy dotyczy to tylko oceny argumentów funkcji?" Moja odpowiedź nie jest sprzeczna z oświadczeniem Wickhama. –