Frage

Diese Frage kommt von einer Reihe von anderen Fragen, die alle beschäftigen sich mit im Wesentlichen dem gleichen Problem. Aus irgendeinem seltsamen Grunde, eine Funktion innerhalb einer anderen Funktion manchmal nicht in dem Sinne, dass Variablen innerhalb der lokalen Umgebung der ersten Funktion definiert ist, nicht wieder in der zweiten Funktion gefunden.

Das klassische Muster in Pseudo-Code:

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

Fehler in eval (ausdr, envir, enclos):   Objekt 'y' nicht gefunden

Zuerst dachte ich, es hatte etwas mit S4 Methoden und dem Scoping dort zu tun, aber es kommt auch mit anderen Funktionen. Ich habe einige Interaktion mit dem R-Entwicklungsteam hatte, aber alles, was sie war, mich auf den Bug-Report-Website lenken tat (was nicht der angenehmsten ist, muss ich sagen). Ich habe nie eine Rückmeldung.

Wie das Problem hält entstehen, frage ich mich, ob es eine logische Erklärung dafür ist. Ist es ein häufiger Fehler in allen diesen Fällen gemacht, und wenn ja, welche? Oder ist es wirklich ein Fehler?

Einige dieser Fragen:

PS: Ich weiß, dass die R-devel Liste, falls Sie ... gewundert

War es hilfreich?

Lösung

Wie Dirk erwähnt in seiner Antwort, es ist nicht wirklich ein Problem mit dem Code, dass Sie auf dem Laufenden. In den Links, die Sie in der Frage veröffentlicht, scheint es ein gemeinsames Thema zu sein: some_function Code dass Verwirrungen über mit Umgebungen in irgendeiner Weise enthält. Das Messing ist entweder explizit, mit new.env und with oder implizit ein data Argumente, dass wahrscheinlich eine Linie hat wie

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

Die Moral der Geschichte ist eine doppelte. Erstens versuchen explizit Manipulation Umgebungen zu vermeiden, wenn Sie wirklich sicher sind, dass Sie wissen, was Sie tun. Und zweitens, wenn eine Funktion ein Datum Argument hat dann alle Variablen setzen, dass Sie die Funktion benötigen innerhalb dieses Datenrahmens zu verwenden.

Andere Tipps

R hat sowohl lexikalischen und Dynamikumfang. Lexikalischen Gültigkeitsbereich arbeitet automatisch, aber Dynamikumfang muss manuell durchgeführt werden, und erfordert eine sorgfältige Buchführung. Nur Funktionen Umfang interaktiv für die Datenanalyse Bedarf dynamisch, so dass die meisten Autoren (wie ich!) Nicht lernen, wie man es richtig zu tun.

. Siehe auch: die Standard Nicht-Standard-Auswertungsregeln

Es gibt zweifellos Fehler in R, aber viele der Probleme, die Leute, die wurden, sind recht häufig Fehler bei der Umsetzung der some_function, R selbst nicht. R hat Scoping-Regeln (siehe http: //cran.r-project .org / doc / manuals / R-intro.html # Scope ), die, wenn sie mit fauler Auswertung von Funktionsargumenten und der Fähigkeit, eval Argumente in anderen Bereichen kombiniert ist extrem leistungsfähig, aber die oft auch zu subtilen Fehlern führen.

Nun gibt es kein Problem in dem, was Sie auf dem Laufenden:

/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$

Könnten Sie neu formulieren und Postan tatsächliche Fehler oder misfeature?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top