Chciałbym użyć operatora potoku %>%
wprowadzonego w magrittr
pakiecie w paczce, którą sam napisałem, aby łańcuchowo dplyr
przekształcić dane. magrittr
jest wymieniony jako Import
w DESCRIPTION
pliku. Po załadowaniu własnego pakietu i przetestowaniu funkcji korzystającej z operatora potoku otrzymuję następujący komunikat o błędzie:
Błąd w functionname (parametr,: nie można znaleźć funkcji "%>%"
Zmiana %>%
na magrittr::%>%
w kodzie źródłowym funkcji również nie pomaga, ponieważ nie można już zbudować pakietu.
r
namespaces
magrittr
alexander keth
źródło
źródło
Odpowiedzi:
Powinno działać poprawnie, jeśli
magrittr
wpisałeś wDepends
. Jednak nie jest to zalecane . Zamiast zostawićmagrittr
wImports
i dodaj następującą linięNAMESPACE
:Proponuję czytanie rozszerzeń Pisanie R . Twoje pytanie zostało omówione w punktach 1.1.3 i 1.5.1.
źródło
roxygen2
, możesz dodać,#' importFrom magrittr "%>%"
aby NAMESPACE wypełniło się automatycznie podczasroxygenize()
.#' @importFrom magrittr "%>%"
%>%
wewnętrznie w pakiecie. Jeśli twoje API wymaga od użytkowników łączenia funkcji przy użyciu%>%
, nadal będą musieli jawnie ładowaćmagrittr
. Jednym ze sposobów rozwiązania tego problemu jest ponowne wyeksportowanie funkcji. Oto przykład, jak to zrobić.Jest teraz łatwiejszy sposób obsługi potoku w pakietach. Wspaniały pakiet
usethis
ma swoją funkcjęuse_pipe()
. Uruchamiasz tę funkcję raz i obsługuje ona wszystko. Oto opisuse_pipe()
funkcji wusethis
dokumentacji:źródło
use_pipe()
do kodu, którego używasz do tworzenia pakietu? Na przykład, polecenie: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)
. Czy dodałbymuse_pipe()
na początku?usethis
funkcji raz podczas tworzenia pakietu. Te funkcje następnie dodają niezbędne części do instrukcji budowy i wszystkiego innego.Jedno dodatkowe rozwiązanie - skorzystaj z
roxygen
pakietu. Jest zaimplementowany jako częśćdevtools
pakietu. Podevtools
zainstalowaniu funkcja dzwonieniadevtools::document()
zaktualizujeNAMESPACE
za Ciebie. Tworzy również automatycznie pliki .Rd z dokumentacją, co jest przydatne.Wszystko, co musisz zrobić, to dodać specjalny komentarz w formacie
#' @import packagename
do pliku, aby zaimportować wszystkie funkcje z tego pakietu lub#' @importFrom packagename functionname
zaimportować funkcję. Możesz mieć dowolną liczbę tych komentarzy w swoich plikach, więc możesz mieć ich zestaw na początku każdego pliku lub z każdą funkcją wymagającą funkcji zewnętrznej.Następnie uruchamiasz
devtools::document()
i analizuje kod w poszukiwaniu tych komentarzy, a następnie tworzy odpowiedniNAMESPACE
plik dla Ciebie. Łatwo.źródło
Zakładając, że używasz RStudio,
devtools
pakietu Hadleya i jest on wymienionymagrittr
w sekcji ImportyDESCRIPTION
pliku, oto kroki, które podjąłem, aby%>%
zadziałać w moich funkcjach pakietu.Najpierw napisz funkcję
foo.R
:Po drugie, biegnij
devtools::document()
.Po trzecie, biegnij
devtools::load_all()
.Plik jak to zostanie utworzony w
R/
katalogu a funkcja powinna działać zgodnie z oczekiwaniami.źródło
@name %>%
?