2012-04-21 17 views
12

In R programing for those coming from other languages John Cook dice cheQuali sono le distinzioni tra ambito lessicale e ambito statico?

R utilizza scoping lessicale, mentre S-PLUS utilizza portata statica. La differenza può essere sottile, in particolare quando si utilizzano chiusure.

Ho trovato questo strano perché ho sempre pensato che lo scope lessicale e lo scope statico fossero sinonimi.

Ci sono degli attributi distinti allo scope lessicale e statico, oppure si tratta di una distinzione che cambia da comunità a comunità, da persona a persona? Se è così, quali sono i campi generali e come posso distinguerli così posso capire meglio il significato di qualcuno quando usano queste parole.

+0

Suppongo che intendessero "dinamico" anziché "lessicale". – Mehrdad

+2

@Mehrdad R non è dinamicamente con scope – efrey

+0

Weiird .. curioso di vedere cosa intendessero allora. Grazie per avermi fatto sapere. – Mehrdad

risposta

10

Wikipedia (e io) sono d'accordo con te che i termini "scope lessicale" e "scope statico" sono sinonimi. This Lua discussion cerca di fare una distinzione, ma osserva che le persone non sono d'accordo su cosa sia questa distinzione. :-)

Mi sembra che il tentativo di distinzione abbia a che fare con l'accesso ai nomi in una diversa funzione-attivazione-record ("stack block", se lo si vuole) rispetto al record di esecuzione più corrente, che principalmente (? solo) si verifica nelle funzioni nidificate:

function f: 
    var x 
    function h: 
     var y 
     use(y) -- obviously, accesses y in current activation of h 
     use(x) -- the question is, which x does this access? 

con scope lessicale, la risposta è "l'attivazione di f che chiama l'attivazione di h" e con portata dinamica significa "l'attivazione più recente per cui qualsiasi variabile denominato x "(che potrebbe non essere f). D'altra parte, se la lingua proibisce l'uso di x affatto, non c'è dubbio su "quale x è questo" poiché la risposta è "errore". :-) Sembra che alcune persone usino "scope statico" per riferirsi a questo terzo caso.

+1

Quindi, in altre parole, lo scoping lessicale senza chiusura? – Mehrdad

+2

Sì. Naturalmente io (come l'OP) sto davvero indovinando cosa significano. – torek

+0

Interessante ... +1 cool – Mehrdad

4

R documentazione ufficiale affronta anche le differenze di portata tra R e S-plus: http://cran.r-project.org/doc/manuals/R-intro.html#Scope

L'esempio dato dal collegamento può essere semplificata come questo:

cube <- function(n) { 
    sq <- function() n*n 
    n*sq() 
} 

I risultati da S-Plus e R sono diversi:

## first evaluation in S 
S> cube(2) 
Error in sq(): Object "n" not found 
Dumped 
S> n <- 3 
S> cube(2) 
[1] 18 
## then the same function evaluated in R 
R> cube(2) 
[1] 8 

Personalmente ritengo che il modo di trattare la variabile in R sia più naturale.