获取函数的命名空间

3
我正在开发一个包,希望为对象添加编辑历史记录。该包允许其他包注册用于编辑对象的函数。我正在寻找一种记录注册函数版本的方法。
问题是:给定一个函数,如何获取它被导出的包?我的想法是研究其搜索路径,但是search()仅报告当前环境的搜索路径,而不是函数所在的路径,这正是我需要的。
非常感谢任何指向其他方法的指针。
获取包的上下文如下:
registerFunction <- function(fun) {
  package <- getPackage(fun)  ## This is what I need
  version <- getPackageVersion(package)
  register(fun, package, version)
}
2个回答

5

您可以使用getAnywhere。例如,如果您正在寻找stringr函数str_locate的名称空间,则可以执行此操作。

getAnywhere("str_locate")$where
# [1] "package:stringr"   "namespace:stringr"

只要stringr在搜索路径上可见,作为S3方法注册或在命名空间中但未导出,这将起作用。
结果是一个带名称的列表,并且您可以使用namesgetAnywhere查看可用内容。
names(getAnywhere("str_locate"))
# [1] "name"    "objs"    "where"   "visible" "dups"  

你知道多个查找结果是否按照它们在当前搜索路径上的位置排序吗? - ThomasP85
我已经查看了帮助文件,它非常有用。我的搜索路径不正确。请参阅?getAnywhere - Rich Scriven

3

您可以使用:

environment(fun=someFunctionName)

它将返回所传递函数的环境,还指定命名空间,即包名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接