2010-06-22 10 views
29

Chciałbym nacisnąć funkcję wewnątrz przestrzeni nazw pakietów, aby mógł uzyskać dostęp do wewnętrznych obiektów tego pakietu (użyjmy na przykład pakietu statystyk). Próbowałem już używaćDodaj obiekty do przestrzeni nazw pakietów

myfun <- function(x) print(x) 
env = loadNamespace("stats") 
assign("myfun", myfun , env) 

Ale jest zablokowany. Tak więc próbowałem odblokować mój obiekt:

unlockBinding("myfun", env) 

Ponieważ myfun jeszcze nie istnieje, nie mogę go odblokować.

Każda pomoc?

Odpowiedz

28

Wzdłuż linii roztworu @ Hadley, ale korzystanie ze środowiska przestrzeni nazw, jak about:

environment(myfun) <- asNamespace('stats') 
+0

świetnie, wielkie dzięki! – TMS

7

Możesz uzyskać dostęp do wewnętrznych obiektów paczki przy użyciu operatora potrójnego jelita grubego :::. Spójrz na przykład na: as.roman i utils:::.roman2numeric. (Porównaj to z utils::.roman2numeric.) Może to pomóc uniknąć umieszczania funkcji wewnątrz przestrzeni nazw.

Możesz również zajrzeć do dont.lockBindings w pakiecie mvbutils, który zatrzymuje przestrzenie nazw.

+0

Jeśli dobrze rozumiem, nie mogę odblokować innych pakietów przestrzeni nazw raz jest zablokowane (z wyjątkiem przeładowanie go za pomocą dont.lockBindings). Dlatego nie można dodać nowej funkcji a posteriori. –

+0

@ Etiennebr: AFAIK, masz rację. Po zablokowaniu przestrzeni nazw nie można jej dodać. Nadal uważam, że ':::' jest sposobem postępowania. –

14

Dlaczego po prostu nie ustawić środowiska swojej nowej funkcji we właściwym miejscu?

myfun <- function(x) print(x) 
environment(myfun) <- as.environment("package:stats") 
+0

Nie wiedziałem o tym! Ale myślę, że chciałbym, żeby był to obszar nazw: statystyki zamiast pakietu: statystyki. Czy jest na to sposób (po prostu zmiana w as.environment() nie działa). –

+1

Przestrzeń nazw nie jest środowiskiem ... – hadley

+7

Spóźniam się na imprezę, ale może to być przydatne dla innych: Przestrzeń nazw faktycznie jest środowiskiem. 'namespace: stats' to _descendent_ globalnego środowiska i zawiera wszystkie obiekty. Wyeksportowane obiekty są kopiowane do 'pakiet: stats', który jest _ancestorem_ środowiska globalnego. – wch