【问题标题】:How do you determine the namespace of a function?如何确定函数的命名空间?
【发布时间】:2011-09-19 17:27:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • 三个优秀的答案;谢谢大家。很难在它们之间做出选择,因为它们都有效,所以我会选择大众投票。

标签: r namespaces


【解决方案1】:

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

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

【讨论】:

  • 订单是否告诉我们什么? find("select") 返回[1] "package:MASS" "package:dplyr" 这是否意味着MASS::select() 将在select() 时被调用?还是订单没有任何意义?
  • 是的,它反映了您将它们加载到会话中的顺序。所以library(MASS); library(dplyr) 导致与library(dplyr); library(MASS) 不同的结果。不用说,这种阴影是不好的做法。
【解决方案2】:

你想要getNamespaceName + environment:

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

【讨论】:

  • 带字符输入:getNamespaceName(environment(get("mean.default"))).
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    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"
    

    【讨论】:

      【解决方案5】:

      当函数不在当前命名空间中时,@hadley's answer 中建议的getNamespaceName() 不起作用。

      以下内容:

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

      根据您的需要设置where 参数。它的documentation

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

      【讨论】:

        猜你喜欢
        • 2018-10-28
        • 2012-01-21
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多