2011-06-21 11 views
31

Dada una función, ¿cómo se determina de qué espacio de nombres proviene?¿Cómo se determina el espacio de nombre de una función?

Por ejemplo, si escribo mean.default en el símbolo del sistema, la salida incluye el hecho de que está en el paquete base. Quiero poder hacer algo como getNamespace(mean.default) y hacer que devuelva "base" (o el entorno base real).

Hay una función getNamespace pero parece que solo acepta nombres de paquetes en lugar de nombres de funciones.

print.function usa el código interno para recuperar el espacio de nombres. Llegué tan lejos como navegar do_printfunction en src/main/print.c pero luego me rendí.

+0

Tres excelentes respuestas; gracias a todos. Es difícil elegir entre ellos ya que todos funcionan, así que voy con el voto popular. –

Respuesta

32

Hace muy poco aprendí acerca de find() que parece hacer exactamente esto.

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

findFunction es otra opción y ?findFunction dice que se debe utilizar en lugar de find con mode="function". El resultado de findFunction es una lista de los entornos donde se encuentran las versiones visibles de la función.

11

¿Quieres getNamespaceName + environment:

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

Con la entrada de caracteres: 'getNamespaceName (environment (get (" mean.default ")))'. –

1

Esta función busca en funciones en los espacios de nombres cargados y entorno global:

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" 
Cuestiones relacionadas