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
Antwort
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.
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. –
- 1. javascript: Wie kann man einen Funktionsnamen beurteilen?
- 2. Schützen von Funktionsnamen in R
- 3. Wie kann man einen Funktionsnamen in F # abrufen?
- 4. Lauf Perl-Skript gesperrt versehentlich einen Ordner
- 5. Wie erstellt man einen dynamischen Funktionsnamen mit Elixir-Makro?
- 6. Wie überprüft man, wenn eine Verzweigung versehentlich mit einer anderen Verzweigung in Git zusammengeführt wird?
- 7. Wie überprüft man, ob eine Datei komprimiert ist in R
- 8. Wie überprüft man einen Popup-Menüpunkt?
- 9. Wie dehnt man einen Datenrahmen in R?
- 10. Wie beschneidet man einen Baum in R?
- 11. versehentlich framebusting
- 12. Wie vermeidet man versehentlich Text in Emacs zu töten?
- 13. Wie überprüft man in C#
- 14. Wie man versehentlich alle Zeilen in einer Tabelle löscht
- 15. Wie überprüft man einen Wert in einer Serie ist einzigartig
- 16. Wie überprüft man, ob XML in SQL einen Wert hat?
- 17. Wie überprüft man einen Wert in Firebase mit angularfire2?
- 18. wie man Funktionswert überprüft?
- 19. Wie Funktionsnamen in Funktion Qt
- 20. Wie konvertiere ich einen Funktionsnamen in eine Zeichenfolge
- 21. Wie kommt man Variablen in Funktionsnamen und getElementById
- 22. Wie überprüft man, ob localhost
- 23. Wie vermeidet man versehentlich 'hg push' statt 'hg qpush'?
- 24. Wie überprüft man Integerüberlauf in C?
- 25. Wie überprüft man Präsenz in Phoenix Framework?
- 26. Wie überprüft man Palindrome in SQL Server
- 27. Wie ersetzt man einen Wert in einem Datenrahmen in R?
- 28. Wie man settings.LOGIN_URL auf einen View-Funktionsnamen in Django setzt 1.5+
- 29. Wie man auf Leerraumeingabe in Python überprüft
- 30. Wie überprüft man "IsEmpty()" in Gson JsonObject?
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
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. –
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