2016-04-07 7 views
0

Ich schreibe einige ziemlich beteiligten R-Code über mehrere Dateien verteilt und gesammelt in einem Paket. Ein Problem, auf das ich gelegentlich gestoßen bin, ist, dass ich eine Dienstprogrammfunktion in einer Datei definieren werde, die denselben Namen wie eine andere in einer anderen Datei definierte Dienstprogrammfunktion hat. Eine der beiden Definitionen wird ersetzt, was zu unbeabsichtigtem Verhalten führt. Gibt es irgendeine Art von Werkzeug, um diese Art von versehentlicher Neudefinition zu überprüfen? Etwas, das überprüfen würde, dass keine zwei Top-Level-Zuweisungen foo <- ... im Paket den gleichen Namen zuweisen?Wie überprüft man versehentlich einen Funktionsnamen in R

+0

Ich würde denken, 'R CMD CHECK' wird Sie wissen lassen, wenn Sie zwei Definitionen der gleichen Funktion in Ihrem Paket haben. Alternativ wird oft empfohlen, jede Funktion 'foo' in einem Paket in einer eigenen Datei' foo.r' zu speichern, die auch das Problem behebt. – Gregor

+0

Das kam tatsächlich in einem Kontext, wo ich CHECK ausgeführt habe, aber es hat nicht die Tatsache, dass ich zwei Funktionsdefinitionen mit dem gleichen Namen hatte. Außerdem tendiere ich dazu, meinen Code als eine große Sammlung kleinerer Funktionen statt einiger Monsterfunktionen zu organisieren. Momentan hat mein Paket fast 250 Funktionsdefinitionen, von denen nur wenige exportiert werden. Dies macht es unpraktisch, jede Funktion in eine eigene Datei zu schreiben. –

+1

An diesem Punkt klingt es wie Ihr Paket ist zu groß, um zu verwalten. Vielleicht sollte es in kleinere Pakete aufgeteilt werden? Es ist natürlich vorzuziehen, kleine Funktionen zu haben, aber auch sehr komplizierte Pakete folgen mehr oder weniger einer Funktion pro Datei. Es ist auch üblich, kleine Utility-Funktionen an einem Ort zu platzieren. [ggplot2, zum Beispiel] (https://github.com/hadley/ggplot2/tree/master/R) hat etwa 170 separate R-Dateien, einschließlich einer 'utils.r', die etwa 30 kleine Utility-Funktionen enthält. – Gregor

Antwort

0

Wie in den Kommentaren erwähnt, ist der richtige Weg, Pakete zu verwenden. Pakete geben Funktionen automatisch ihre eigenen Namespaces, und sie machen es sehr einfach, Code wiederzuverwenden und zu teilen. Wenn Sie RStudio verwenden, können Sie es mit wenig Aufwand im Menü Neues Projekt erstellen.

Wenn Sie jedoch aus irgendeinem Grund keine Pakete oder Namespaces verwenden können, gibt es immer noch eine Möglichkeit, das zu tun, was Sie wollen: Sie können eine Variable sperren (einschließlich einer Funktion), so dass sie nicht überschrieben werden kann.

> pin <- 11 
> lockBinding("pin", .GlobalEnv) 
> pin <- 12 
Error: cannot change value of locked binding for 'pin' 

Siehe Binding and Environment Locking für weitere Einzelheiten.

+0

Ich benutze Pakete; Dieses Problem entstand im Zusammenhang mit der Entwicklung eines R-Pakets, das derzeit 17 Quelldateien enthält. Es kann sinnvoll sein, dieses Paket in mehrere Pakete aufzuteilen, aber selbst bei einer kleineren Codebasis kann das Problem auftreten. –

Verwandte Themen