你如何确定函数的命名空间?

时间:2011-06-21 17:07:17

标签: r namespaces

给定一个函数,你如何确定它来自哪个命名空间?

例如,如果我在命令提示符下键入mean.default,则输出包括它在基本包中的事实。我希望能够做getNamespace(mean.default)这样的事情并让它返回“base”(或实际的基础环境)。

有一个getNamespace函数,但似乎只接受包名而不是函数名。

print.function使用内部代码来检索命名空间。我在do_printfunction中浏览src/main/print.c,但随后放弃了。

5 个答案:

答案 0 :(得分:34)

我最近了解到find()似乎就是这样做的。

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

答案 1 :(得分:14)

findFunction是另一种选择,?findFunction表示您应该使用find代替mode="function"findFunction的结果是函数的可见版本所在的环境列表。

答案 2 :(得分:12)

您想要getNamespaceName + environment

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

答案 3 :(得分:1)

此函数搜索已加载的命名空间和全局环境中的函数:

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"

答案 4 :(得分:0)

如果功能不在当前名称空间中,则@hadley's answer中提出的

getNamespaceName()无效。

以下内容确实存在:

environmentName(findFunction(f = "str_detect",
                             where = getNamespace("stringr"))[[1]])

根据需要设置where参数。其documentation

从中搜索对象的环境,名称空间或搜索列表位置。默认情况下,从调用函数的顶级环境开始,通常是全局环境(即,使用搜索列表),或调用来自的程序包的名称空间。间接调用任何这些函数时,提供此参数很重要。对于包名称空间,此类调用中的默认值很可能是错误的。