2017-06-22 56 views
2

我在調試一些代碼,我想我可能在兩個包中有兩次相同的功能。如何獲取R中函數的包名?

我想輸出函數的包名稱,因爲它將由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()是不是一個可以接受的答案!我不在尋找像這樣命名的潛在的其他功能,我正在尋找我當前使用的軟件包名稱!

+0

你嘗試'findAllFun < - 函數(f){ ħ< - help.search(paste0( 「^」,F, 「$」),AGREP = FALSE) H $比賽[」包「] } findAllFun(」qplot「)'from https://stackoverflow.com/questions/10553755/name-of-a-package-for-a-given-function-in-r – AK88

+1

如果你想要使用一個特定的函數,你可以使用'package :: function',通常這是你上次加載的包的功能,我認爲。你也可以輸入函數名,你會看到它來自環境的地方(例如用'select',你得到'') – Cath

+0

@ AK88'findAllFun(「select」)'返回'「dplyr」「MASS」',這對我沒有太大幫助 –

回答

6

甚至是最方便的試用功能where,如果你僅僅是包的名字後:

environmentName(environment(select))

的好處是,這將產生一個字符串而不是一個環境對象。

2

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" 
0

這不是一個比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"