2011-06-21 19 views
31

Biorąc pod uwagę funkcję, w jaki sposób określić, z której przestrzeni nazw pochodzi?Jak określić przestrzeń nazw funkcji?

Na przykład, jeśli wpiszę w wierszu polecenia mean.default, dane wyjściowe zawierają fakt, że znajduje się on w pakiecie podstawowym. Chcę móc zrobić coś takiego, jak getNamespace(mean.default) i przywrócić "podstawową" (lub rzeczywiste środowisko bazowe).

Istnieje funkcja getNamespace, ale wydaje się akceptować tylko nazwy pakietów, a nie nazwy funkcji.

print.function wykorzystuje wewnętrzny kod do pobrania przestrzeni nazw. Doszedłem do przeglądania do_printfunction w src/main/print.c, ale potem się poddałem.

+0

Trzy doskonałe odpowiedziami; Dziękuje wszystkim. Trudno wybrać między nimi, ponieważ wszystkie one działają, więc idę z popularnym głosowaniem. –

Odpowiedz

32

Bardzo niedawno dowiedziałem się o find(), który wydaje się robić właśnie to.

R> find("ls") 
[1] "package:base" 
R> find("na.locf") 
[1] "package:zoo" 
13

findFunction ma innej opcji i ?findFunction mówi powinien go używać zamiast find z mode="function". Wynik findFunction jest listą środowiska (ów), w którym znajdują się widoczne wersje funkcji.

11

Chcesz getNamespaceName + environment:

getNamespaceName(environment(mean.default)) 
# [1] "base" 
+1

Wprowadzając znaki: 'getNamespaceName (environment (get (" mean.default ")))'. –

1

Funkcja ta wyszukuje funkcje załadowanych nazw i globalnego środowiska:

getEnvName <- function(f) { 
    attached <- c(environmentName(.GlobalEnv), loadedNamespaces()) 
    envs <- c(.GlobalEnv, lapply(attached[-1], .getNamespace)) 
    attached[vapply(envs, function(env) exists(f, env, inherits = FALSE), logical(1))] 
} 
median <- function() {} 
getEnvName("median") 
#> [1] "R_GlobalEnv" "stats" 
getEnvName(".try_quietly") 
#> [1] "tools" 
getEnvName("getEnvName") 
#> [1] "R_GlobalEnv" 
Powiązane problemy