2010-10-01 10 views
14

Questa domanda deriva da una serie di altre domande che riguardano essenzialmente lo stesso problema. Per qualche strana ragione, l'utilizzo di una funzione all'interno di un'altra funzione a volte fallisce nel senso che le variabili definite all'interno dell'ambiente locale della prima funzione non vengono trovate nella seconda funzione.Scoping e funzioni in R 2.11.1: Cosa non funziona?

Il modello classico in pseudo-codice:

ff <- function(x){ 
    y <- some_value 
    some_function(y) 
} 
ff(x) 

Errore nei Eval (espressione, Envir, enclos): oggetto 'y' non trovato

Innanzitutto ho pensato che avesse qualcosa a che fare con i metodi S4 e l'ambito, ma succede anche con altre funzioni. Ho avuto qualche interazione con il team di sviluppo R, ma tutto ciò che hanno fatto è stato indirizzare al sito di segnalazione bug (che non è il più invitante, devo dire). Non ho mai avuto alcun feedback.

Come il problema continua a sorgere, mi chiedo se c'è una spiegazione logica per questo. È un errore comune fatto in tutti questi casi e, in tal caso, quale? O è davvero un bug?

Alcune di queste domande:

PS: So che la R-devel list, nel caso ti stia chiedendo ...

+0

Mi piace la soluzione alternativa su questo http://stackoverflow.com/questions/3742415/r-statistical-scoping-error-using-transformby-part-of-the-doby-package –

+0

Ho anche contattato R-devel , e lì mi è stato detto circa lo stesso di @Richie, @ Jonathan, e @hadley mi ha detto. Grazie a tutti per le preziose risposte. –

risposta

3

Come Dirk ha menzionato nella sua risposta, non c'è in realtà un problema con il codice che hai postato. Nei link che hai postato nella domanda, sembra esserci un tema comune: some_function contiene codice che mette in disaccordo con gli ambienti in qualche modo.Questo Messing è o esplicito, utilizzando new.env e with o implicito, utilizzando un argomento data, che, probabilmente, ha una linea simile

y <- eval(substitute(y), data) 

La morale della storia è duplice. In primo luogo, cerca di evitare di manipolare esplicitamente gli ambienti, a meno che tu non sia realmente sicuro di sapere cosa stai facendo. E in secondo luogo, se una funzione ha un argomento di dati, allora metti tutte le variabili che ti servono per usare la funzione all'interno di quel frame di dati.

+0

Come ho risposto a Dirk, so che non c'è un problema con quel codice. Era solo un'illustrazione. Grazie per la risposta, questo lo riassume abbastanza bene, credo. E grazie per la mancia, che sicuramente mi eviterà un sacco di frustrazione. Accettato. –

4

Ci sono indubbiamente bug in R, ma molti dei problemi che le persone hanno riscontrato sono spesso errori nell'implementazione di some_function, non di R stesso. R ha regole di scoping (vedi http://cran.r-project.org/doc/manuals/R-intro.html#Scope) che, se combinate con la valutazione lenta degli argomenti delle funzioni e la capacità di argomenti in eval in altri ambiti, sono estremamente potenti ma spesso portano a errori sottili.

0

Beh c'è nessun problema in quello che hai postato:

/tmp$ cat joris.r 
#!/usr/bin/r -t 

some_function <- function(y) y^2 

ff <- function(x){ 
    y <- 4 
    some_function(y) # so we expect 16 
} 
print(ff(3))   # 3 is ignored 
$ ./joris.r 
[1] 16 
/tmp$ 

Potresti riformulare e Postan bug reale o misfeature?

+0

Ha fornito collegamenti a 5 esempi. –

+0

Fantastico, quali sono i prossimi. Fare riferimento a * basta andare a cercarlo nell'intero te stesso *? Scusa, aiuto concreto per domande concrete e concrete. Joris è un cookie molto intelligente e sarei lieto di provare ad aiutare con domande esplicite. –

+1

La mia domanda riguarda il collegamento tra i cinque bug. Non potrei davvero copiare e incollare l'intera discussione tenuta lì, potrei? –

5

R ha un ambito lessicale e dinamico. Lo scope lessicale funziona automaticamente, ma l'ambito dinamico deve essere implementato manualmente e richiede un'accurata contabilità. Solo le funzioni utilizzate in modo interattivo per l'analisi dei dati hanno bisogno di un ambito dinamico, quindi molti autori (come me!) Non imparano come farlo correttamente.

Vedere anche: standard non-standard evaluation rules.