¿Cómo se determina el espacio de nombre de una función?

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

Por ejemplo, si mean.default en el símbolo del sistema, el resultado 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 código interno para recuperar el espacio de nombres. Llegué a do_printfunction en src/main/print.c pero luego me di por vencido.

Recientemente aprendí sobre find() que parece hacer esto.

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

findFunction es otra opción y ?findFunction dice que deberías usarlo 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.

Desea getNamespaceName + environment :

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

Esta función busca funciones en los espacios de nombres cargados y en el 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"