2016-03-22 7 views
0

Ich bin ein neues R-Paket zu schreiben und feststellen, dass Variablen, die ich nicht explizit auf eine Funktion im Paket übergeben (als Eingabeargument) ist in ihn, zum Beispiel:R-Paket kann Variablen sehen nicht an sie übergaben

myFunc <- function(a,b,c) { 
    print(d) 
} 

wo d ist in der aufrufenden .R Skript, aber nicht an myFunc übergeben wurde, ist sichtbar.

Jede Hilfe wäre toll, danke; Ich verwende R 3.2.4 und habe roxygen2 (über devtools::document()) verwendet, um das NAMESPACE zu erstellen, wenn das hilft.

+1

Tritt dieses Verhalten nach der Installation des Pakets oder nur während des Entwicklungs-/Testprozesses auf? – nrussell

+0

Ich sehe es nach der Installation des Pakets, d. H. Nach dem Ausführen von 'R CMD INSTALL myPackage' und dann mit einem .R-Skript außerhalb des Pakets Aufruf' myFunc() '. –

+0

Dies liegt an den Scoping-Regeln von R. Es gibt ein neues Paket "Module" auf CRAN, das hilft, dieses häufige Problem zu lösen. Weitere Details finden Sie in meiner Antwort auf http://stackoverflow.com/questions/6216968/r-force-local-scope?lq=1 – Uwe

Antwort

1

Ist das nicht nur eine Konsequenz der Scoping-Regeln in R?

Ihre Funktion definiert eine neue myFunc Umgebung. Wenn Sie versuchen, d in print(d) zu referenzieren, überprüft der Interpreter zuerst die myFunc-Umgebung für ein Objekt mit Name d. Da kein solches Objekt existiert, prüft der Interpreter als nächstes die aufrufende Umgebung nach einem Objekt mit dem Namen d. Es findet die in Ihrem .R-Skript definierte Variable und druckt sie dann aus.

Hier ist a link mit mehr Informationen und einem Stapel von Beispielen.

0

Sehr nützlicher Link, danke. Es sieht aus wie zwingt begrenzten Scoping innerhalb einer Funktion (dh eine Funktion nicht immer den globalen Bereich zuzugreifen) ist keine Standardeigenschaft von R.

mir eine ähnliche Frage hier: R force local scope

Mit der checkStrict Funktion geschrieben durch den Hauptverantwortlichen auf diese Frage scheint gearbeitet zu haben; es hat eine unbeabsichtigte Verwendung einer globalen Variable gefunden.

> require(myCustomPackage) 
> checkStrict(showDendro) 
Warning message: 
In checkStrict(showDendro) : global variables used: palName 

wo showDendro eine Funktion in meinem benutzerdefinierten Paket.

So scheint es, die Lösung für mein Problem ist:

1), während Sie R Bewegung bis zu der globalen Umwelt durch Einschließen alle Funktionen in der local() Funktion stoppen, die wie eine langweilige Lösung scheint.

2) Wenn Sie Code aus der allgemeinen Umgebung in eine eigene Funktion verschieben, führen Sie etwas wie checkStrict aus, um die unbeabsichtigte Verwendung globaler Variablen zu entfernen.

Verwandte Themen