Qui creo un'espressione non valutata:Qual è il meccanismo che rende `+` funzionante quando definito da + in un ambiente vuoto?
e2 <- expression(x+10)
Se io fornisco un ambiente in cui x
è definito come
env <- as.environment(list(x=20))
eval(e2,env)
R segnalerà un errore:
Error in eval(expr, envir, enclos) : could not find function "+"
è comprensibile dal env
è un ambiente creato da zero, cioè non ha un ambiente genitore dove +
è definito.
Tuttavia, se fornisco +
nella lista per essere convertito in un ambiente come questo
env <- as.environment(list(x=20,`+`=function(a,b) {a+b}))
eval(e2,env)
La valutazione funziona correttamente e rese 30.
Tuttavia, quando definisco +
nella lista, è una funzione binaria il cui corpo usa anche + che è definito in {base}
. So che i ritorni delle funzioni sono ponderati in R, ma perché potrebbe funzionare? Se il valore a+b
nel corpo della funzione viene valutato pigramente, quando si chiama eval
per e2
all'interno di env
, anche se +
è definito in questo ambiente che non ha un ambiente principale, dovrebbe comunque chiamare +
in sé, che dovrebbe finire in un ciclo infinito. Perché non succede così? Qual è il meccanismo qui?
È possibile trovare http://adv-r.had.co.nz/Environments.html utile. – hadley
È bello vederti qui, @hadley! Ho letto il tuo fantastico nuovo libro online un mese fa. Forse mi manca un punto e ce ne sono sicuramente di più da digerire. Grazie comunque! –
La distinzione principale è "l'ambiente in cui viene creata la funzione" rispetto a "l'ambiente in cui si trova la funzione" – hadley