我正在调试一些代码,我想我可能在两个包中有两倍相同的功能。
我想输出函数的包名,因为它将由R控制台执行。
示例:
function_package_name(print)
# - >基function_package_name(select)
# - > dplyr 我不能简单地使用?select
因为我认为它链接到2个包的选择:dplyr
和MASS
。
我如何知道我正在使用的select
功能?
注意:这不是list all functions on CRAN的重复,也不是Find the package names from a function name in R的重复,因此sos::findFn()
不是可接受的答案!我不是在寻找像这个名字的潜在的其他功能,我正在寻找我正在使用的那个的包名!
答案 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"