Używam pakietu R, w którym są 2 funkcje f1 i f2 (z f2 calling f1)
Chcę zastąpić funkcję f1.R: Jaki jest właściwy sposób nadpisywania funkcji z paczki?
Od wersji 2.15 i obowiązkowego użycia przestrzeni nazw w pakietach, jeśli po prostu otrzymuję nową funkcję, jest ona faktycznie dostępna w środowisku globalnym (tj. Samo wywołanie f1 (x) w konsoli zwraca nowy wynik). Jednak wywołanie f2 nadal będzie używać zapakowanej funkcji f1. (Ponieważ przestrzeń nazw modyfikuje ścieżkę przeszukiwania i zamyka ją zgodnie z wytłumaczonym opisem: here in the Writing R Extensions samouczek)
Jaki jest właściwy sposób całkowitego zastąpienia f1 nowym? (oprócz budowania ponownie pakietu!) Może to być przydatne w kilku sytuacjach. Na przykład, jeśli istnieje błąd w pakiecie, który nie został opracowany. Lub jeśli nie chcesz ponownie budować pakietów codziennie, gdy są jeszcze w fazie rozwoju.
wiem o funkcji
assignInNamespace("f1",f1,ns="mypackage")
Jednak strona pomocy ?assignInNamespace
jest nieco enignmatic i wydaje się zniechęcać ludzi od używania go bez podania więcej informacji, i nie mogłem znaleźć żadnych rekomendacji najlepszych praktyk na oficjalny tutorial CRAN. i po wywołaniu tej funkcji:
# Any of these 2 calls return the new function
mypackage::f1
getFromNamespace(x = "f1", envir = as.environment("package:mypackage"))
# while this one still returns the old packaged version
getFunction(name = "f1", where = as.environment("package:mypackage"))
To bardzo niepokojące. Jak wpływa na to ścieżka wyszukiwania?
Na razie robię jakieś brzydkie rzeczy, takich jak modyfikowanie funkcji lockEnvironment
tak że library
nie blokuje nazw pakietów, i mogę zablokować ją w późniejszym etapie raz Wymieniłem F1 (co nie wydaje się naprawdę dobry praktyki)
Więc w zasadzie mam 2 pytania:
- co to dokładnie
assignInNamespace
w przypadku nazw pakietu (który ma zostać zablokowany) - Jakie są dobre praktyki?
wielkie dzięki za podzielenie się z Państwem swoim doświadczeniem.
EDYCJA: osoby zainteresowane tym pytaniem mogą uznać obiekt this blog post za bardzo interesujący.
Świetne pytanie. Ostatnio szukałem wyjaśnienia, znalazłem [stary wątek] (https://stat.ethz.ch/pipermail/r-help/2008-August/171217.html) na temat, który wydaje się być odpowiedni . – tonytonov
@tonytonov Dzięki za twój link. Nie udało mi się zrozumieć, co robił "unlockBinding" w przypadku pakietu. Wydaje się, że robienie właśnie 'assignInNamespace' ma dokładnie taki sam wynik. Jakaś wskazówka? – RockScience
Niezupełnie. Zgodnie z moim doświadczeniem 'assignInNamespace' działa lub nie działa w zależności od pakietu i nie mam pojęcia, dlaczego tak się dzieje. Jeśli się nie powiedzie, to rozwiązanie obejmujące 'unlockBinding' również nie działa. – tonytonov