R: Was ist der richtige Weg, um eine Funktion aus einem Paket zu überschreiben?

9

Ich verwende ein R-Paket, in dem es zwei Funktionen f1 und f2 gibt (wobei f2 f1 aufruft) Ich möchte die Funktion f1 überschreiben.

Seit R 2.15 und die obligatorische Verwendung von Namespace in Paketen, wenn ich nur die neue Funktion Quelle, ist es tatsächlich in der globalen Umgebung (dh. nur f1 (x) in der Konsole ruft das neue Ergebnis zurück). Bei Aufruf von f2 wird jedoch weiterhin die paketierte Funktion f1 verwendet. (Weil der Namespace den Suchpfad ändert und ihn wie abschließt hier im Writing R Extensions Tutorial)
Was ist der richtige Weg, um f1 vollständig durch den neuen zu ersetzen? (abgesehen davon, dass Sie das Paket erneut erstellen!) Dies kann in verschiedenen Situationen nützlich sein. Zum Beispiel, wenn ein Fehler in einem Paket enthalten ist, das Sie nicht entwickelt haben. Oder wenn Sie Ihre Pakete nicht jeden Tag neu erstellen möchten, während sie noch in Entwicklung sind.

Ich weiß über Funktion

%Vor%

Allerdings ist die Hilfeseite ?assignInNamespace etwas rätselhaft und scheint die Leute davon abzuhalten, sie zu benutzen, ohne mehr Informationen zu geben, und ich konnte keine Best-Practice-Empfehlungen zum offiziellen CRAN-Tutorial finden. und nach dem Aufruf dieser Funktion:

%Vor%

Das ist sehr beunruhigend. Wie ist der Suchpfad betroffen?

Im Moment mache ich ein paar hässliche Dinge wie das Ändern der Funktion lockEnvironment , so dass library den Paketnamensraum nicht sperrt, und ich kann es zu einem späteren Zeitpunkt sperren, nachdem ich f1 ersetzt habe (was wirklich scheint keine gute Praxis)

Also im Grunde habe ich 2 Fragen:

  1. Was genau macht assignInNamespace im Falle eines Paketnamensraums (der gesperrt sein soll)
  2. Was sind die guten Praktiken?

vielen Dank für Ihre Erfahrungen dort zu teilen.

EDIT: Leute, die an dieser Frage interessiert sind, finden diesen Blog-Beitrag äußerst interessant .

    
RockScience 30.10.2014, 03:41
quelle

1 Antwort

3

Es gibt viele verschiedene Fälle hier.

Wenn es sich um einen Fehler im Paket von jemand anderem handelt
Dann ist es am besten, den Paketbetreuer zu kontaktieren und ihn zu überreden, es zu reparieren. Auf diese Weise erhält jeder die Lösung, nicht nur Sie.

Wenn es sich bei der Entwicklung eines eigenen Pakets um einen Fehler handelt
Dann müssen Sie einen Workflow finden, mit dem das erneute Erstellen von Paketen einfach ist. Wie das devtools -Paket und die Eingabe von build(mypackage) oder das Klicken auf eine Schaltfläche ("Build & amp; Reload" in RStudio; "R CMD build" im Architect).

Wenn Sie nur ein anderes Verhalten für ein vorhandenes Paket wünschen
Wenn es sich nicht um einen Fehler handelt oder der Paketverwalter die gewünschte Korrektur nicht durchführt, müssen Sie eine eigene Kopie von f1 erstellen. Die Verwendung von assignInNamespace , um es im vorhandenen Paket zu überschreiben, ist zum Erkunden OK, aber es ist ein wenig hacky, also ist es nicht wirklich für eine dauerhafte Lösung geeignet.

Am besten erstellen Sie ein eigenes Paket mit Kopien von f1 und f2 . Das ist weniger Aufwand als es klingt, da Sie einfach f2 <- existingpackage::f2 definieren können.

Als Antwort auf den Kommentar:

  

Der zweite und dritte Fall macht Sinn, wenn Sie alleine sind, aber sie müssen die Pakete erstellen und installieren, was im Fall meiner Organisation schwierig ist, da die Pakete auf Dutzenden von Computern installiert sind und ich Root-Zugriff benötige, um die Pakete zu aktualisieren.

Nehmen Sie also eine Kopie der vorhandenen Paketquelle, wenden Sie Ihren Patch an und hosten Sie ihn in Ihrem Firmennetzwerk oder github oder Bitbucket. Dann kann das aktualisierte Paket programmgesteuert über

installiert werden %Vor%

oder

%Vor%

Da es sich bei der Installation nur um eine Codezeile handelt, können Sie sie problemlos auf beliebig viele Computer übertragen. Sie benötigen auch keinen Root-Zugriff - installieren Sie einfach das Paket in einen Bibliotheksordner, der keinen Root-Zugriff zum Schreiben benötigt. (Lesen Sie das Startup und . libPaths Hilfeseiten zum Definieren einer neuen Bibliothek. Sie benötigen Netzwerkzugriff auf diese Maschinen, aber ich kann Ihnen dabei nicht helfen. Sprechen Sie mit Ihrem Netzwerkadministrator oder Ihrem Chef oder wer auch immer Ihnen die Erlaubnis geben kann.

    
Richie Cotton 30.10.2014, 07:46
quelle

Tags und Links