如何在R中获取函数的包名?

时间:2017-06-22 10:12:12

标签: r function package

我正在调试一些代码,我想我可能在两个包中有两倍相同的功能。

我想输出函数的包名,因为它将由R控制台执行。

示例:

  • function_package_name(print)# - >基
  • function_package_name(select)# - > dplyr

我不能简单地使用?select因为我认为它链接到2个包的选择:dplyrMASS

我如何知道我正在使用的select功能?

注意:这不是list all functions on CRAN的重复,也不是Find the package names from a function name in R的重复,因此sos::findFn()不是可接受的答案!我不是在寻找像这个名字的潜在的其他功能,我正在寻找我正在使用的那个的包名!

3 个答案:

答案 0 :(得分:7)

如果你只是在包名之后,也许最方便的是:

environmentName(environment(select))

优点是这会产生一个字符串而不是一个环境对象。

答案 1 :(得分:2)

尝试 where 包中的pryr功能

> library(dplyr)
> pryr::where("select")
<environment: package:dplyr>
attr(,"name")
[1] "package:dplyr"
attr(,"path")
[1] "/home/francois/.R/library/dplyr"
> library(MASS)
> pryr::where("select")
<environment: package:MASS>
attr(,"name")
[1] "package:MASS"
attr(,"path")
[1] "/home/francois/.R/library/MASS"

答案 2 :(得分:1)

这不是一个比jkt更好的答案,但无论如何我都是喋喋不休的,因为AK88的findAllFun引起了我的兴趣,因为找到所有的功能可以加载到搜索路径(虽然应该注意AK88的函数似乎返回库中名称空间中具有函数名的所有软件包)。

无论如何,这是一个函数,它将返回包含所需名称函数的包名称向量。最重要的是,它按搜索路径的顺序对包名称进行排序。这意味着如果只键入function_name,将遇到函数的第一个包是结果中的第一个包。

locate_function <- function(fun, find_in = c("searchpath", "library")){
  find_in <- match.arg(arg = find_in, 
                       choices = c("searchpath", "library"))

  # Find all libraries that have a function of this name.
  h <- help.search(pattern = paste0("^", fun, "$"),
                   agrep = FALSE) 
  h <- h$matches[,"Package"] 

  if (find_in == "library") return(h)

  # List packages in the search path
  sp <- search()
  sp <- sp[grepl("^package", sp)]
  sp <- sub("^package[:]", "", sp)

  # List the packages on the search path with a function named `fun` 
  # in the order they appear on the search path.
  h <- h[h %in% sp]
  h[order(match(h, sp, NULL))]
}

## SAMPLE OUTPUT

library(dplyr)
library(MASS)

locate_function("select")
# [1] "MASS"  "dplyr"

## Unload the dplyr package, then reload it so.
## This makes it appear BEFORE MASS in the search path.

detach("package:dplyr", unload = TRUE) 
library(dplyr)

locate_function("select")
# [1] "dplyr" "MASS"

它还包含一个选项,可让您查看包含所需名称功能的所有包(甚至是已卸载的包)。

locate_function("select", find_in = "library")
# [1] "dplyr"  "raster" "MASS"