2014-07-09 3 views
6

Beim Erstellen eines R-Pakets gibt es mindestens zwei Alternativen, um Funktionen in importierten Paketen zu referenzieren.Wie sollte ich Funktionen in importierten Paketen referenzieren?

Entweder

  1. Explizit der Name der Funktion, die doppelten Doppelpunkt-Operator, wann immer Sie es nennen, package::function.

  2. Fügen Sie importFrom(package, function) in die Datei NAMESPACE ein, entweder direkt oder über einen #' @importFrom package function Roxygen-Tag.

Was sind die Vor- und Nachteile der einzelnen Methoden?

Gibt es technische Unterschiede hinsichtlich der einzelnen Syntax?

+0

Doppelter Doppelpunkt kann nur exportierte Funktionen referenzieren. Sie müssen andernfalls Tripel-Doppelpunkt verwenden. – James

+2

@James Das stimmt, aber Sie sollten nicht auf nicht exportierte Funktionen von Paketen anderer Leute zugreifen, da die API Ihren Code ändern und brechen könnte. –

+0

Wild raten: Ich denke 'importFrom' importiert die Funktion, wenn Sie Ihr Paket laden, aber '::' sucht zur Laufzeit, so dass 'importFrom' das Paket länger zum Laden braucht, aber' :: 'macht Ihren Code läuft langsamer. Ich vermute, dass es jeweils nur um Mikrosekunden Unterschiede geht. –

Antwort

6

Argumente für package::function

mit Es es völlig klar macht, wo die Funktion von gekommen ist.

Argumente für @importFrom package function

mit geht es weniger tippen, vor allem, wenn eine Funktion viele Male von Ihrem Paket verwendet wird.

Da es um das Nachschlagen des Pakets und einen Aufruf der ::-Funktion geht, hat package::function eine kleine Laufzeitleistungseinbußen. Siehe https://stackoverflow.com/a/7283511/134830.

Alles in allem, was ist das Urteil?

Beide Methoden machen den Job und die Argumente sind nicht überwältigend, also verlieren Sie nicht den Schlaf über diese. Wählen Sie einfach eine Methode und bleiben Sie dabei.

Die Richtlinie, die an meinem Arbeitsplatz angenommen wurde, ist, dass für einige häufig verwendete Pakete @importFrom roxygen Tags verwendet werden sollten. Zum Beispiel wird erwartet, dass Entwickler wissen, dass ddply von plyr kommt, oder Funktionen beginnend str_ kommen von stringr. In diesem Fall ist die explizite Abstammung der Funktion nicht so nützlich zu wissen. Für Funktionen außerhalb dieser Kernliste (oder falls Unklarheiten bestehen) sollte :: verwendet werden, um deutlich zu machen, woher es kommt.

Verwandte Themen