Ich möchte %>%
den magrittr
im Paket eingeführten Pipe-Operator in einem Paket verwenden, das ich selbst geschrieben habe, um dplyr
Datentransformationen zu verketten. magrittr
ist wie Import
in der DESCRIPTION
Datei aufgeführt. Nach dem Laden meines eigenen Pakets und dem Testen der Funktion, die den Pipe-Operator verwendet, wird die folgende Fehlermeldung angezeigt:
Fehler im Funktionsnamen (Parameter ,: Funktion "%>%" konnte nicht gefunden werden
Das Ändern %>%
in magrittr::%>%
im Funktionsquellcode hilft auch nicht, da das Paket nicht mehr erstellt werden kann.
r
namespaces
magrittr
alexander keth
quelle
quelle
Antworten:
Es hätte richtig funktionieren sollen, wenn Sie in
magrittr
aufgeführt hättenDepends
. Dies wird jedoch nicht empfohlen . Stattdessen lassen Siemagrittr
inImports
und fügen die folgende Zeile hinzuNAMESPACE
:Ich schlage vor, Writing R-Erweiterungen zu lesen . Ihre Frage wird in den Absätzen 1.1.3 und 1.5.1 behandelt.
quelle
roxygen2
, können Sie hinzufügen#' importFrom magrittr "%>%"
, dass NAMESPACE während automatisch gefüllt wirdroxygenize()
.#' @importFrom magrittr "%>%"
%>%
interne Verwendung in Ihrem Paket zulassen . Wenn Ihre API erfordert, dass Benutzer Funktionen mit verketten%>%
, müssen sie dennoch explizit ladenmagrittr
. Eine Möglichkeit, dieses Problem zu lösen, besteht darin, die Funktion erneut zu exportieren. Hier ist ein Beispiel dafür.Eine zusätzliche Lösung - verwenden Sie das
roxygen
Paket. Es ist als Teil desdevtools
Pakets implementiert . Sobalddevtools
die Installation installiert ist,devtools::document()
wird Ihr AnrufNAMESPACE
für Sie aktualisiert . Außerdem werden automatisch RD-Dateien mit Dokumentation erstellt, was praktisch ist.Sie fügen einer
#' @import packagename
Datei lediglich einen speziellen Kommentar im Format hinzu , um alle Funktionen aus diesem Paket#' @importFrom packagename functionname
zu importieren oder eine Funktion zu importieren. Sie können so viele dieser Kommentare in Ihren Dateien haben, wie Sie möchten, sodass Sie eine Reihe davon oben in jeder Datei oder für jede Ihrer Funktionen haben können, die eine externe Funktion benötigen.Dann führen Sie es aus
devtools::document()
und es analysiert Ihren Code nach diesen Kommentaren und erstellt dann eine geeigneteNAMESPACE
Datei für Sie. Einfach.quelle
Es gibt jetzt eine einfachere Möglichkeit, die Pipe in Ihren Paketen zu unterstützen. Das wunderbare Paket
usethis
hat die Funktionuse_pipe()
. Sie führen diese Funktion einmal aus und sie behandelt alles. So wird dieuse_pipe()
Funktion in derusethis
Dokumentation beschrieben:quelle
use_pipe()
dem Code hinzu, mit dem Sie das Paket erstellen? Zum Beispiel starte ich :usethis::use_description(usethis_description); usethis::use_build_ignore(directories); usethis::use_build_ignore(paste0(pkg_name, ".Rproj")); if (file.exists(file.path(pkg_path, "NAMESPACE"))) { file.remove(file.path(pkg_path, "NAMESPACE")) }; devtools::document(pkg_path); devtools::check(pkg_path); devtools::load_all(pkg_path); devtools::install(pkg_path)
. Würde ich nuruse_pipe()
am Anfang hinzufügen ?usethis
Funktionen einmal, wenn Sie das Paket entwickeln. Diese Funktionen fügen dann die erforderlichen Teile zu den Bauanweisungen und allem anderen hinzu.Angenommen, Sie verwenden RStudio, Hadleys
devtools
Paket, und sindmagrittr
im Abschnitt "Importe" derDESCRIPTION
Datei aufgeführt. Hier sind die Schritte, die ich unternommen habe, um die%>%
Arbeit in meinen Paketfunktionen zu erledigen.Schreiben Sie zunächst die Funktion
foo.R
:Zweitens laufen
devtools::document()
.Drittens laufen
devtools::load_all()
.Eine Datei wie diese in Ihrem erstellt wird
R/
Verzeichnis und Ihre Funktion sollte wie erwartet funktionieren.quelle
@name %>%
hier?