2015-09-11 48 views
6

R包中有沒有一種方法代碼可以找出其中它包含哪個包或名稱空間?R包中的代碼:找出它是哪個*包/名稱空間


背景:我發現我在軟件包名稱中有不同的軟件包之間的通用代碼。一個常見的例子tests/testthat.R

library(testthat) 
library(ShiftedExcitation) 

test_check("ShiftedExcitation") 

如果代碼可以找出哪個包或命名空間是屬於,我會避免一些地方的包名現在的指定位置。


現在我定義包含包名稱的隱變量,說

.PKG <- "ShiftedExcitation"

然後用東西沿着 *

library(testthat) 
library(.PKG, character.only = TRUE) 

test_check(.PKG) 

,但我行我很好奇是否存在更優雅的解決方案。

*我沒有得到這個工作,因爲testthat.R在軟件包命名空間外被評估。不過,它確實可以在包代碼中定義一個unittest函數。

+0

您可以使用'.getNameSpace(match.call()[[1]])'抓取該函數的名字作爲參數。可能有幫助:http://stackoverflow.com/questions/15595478/how-to-get-the-name-of-the-calling-function-inside-the-called-routine –

+0

'getNamespaceName(topenv())'?例如,'debug(lm); LM(); getNamespaceName(topenv())' –

+0

@MartinMorgan:'topenv'幾乎就是答案 - 只不過'testthat'命名空間可以在'search()'路徑中的pacakge之前。 – cbeleites

回答

0

走近一個答案:

@ MartinMorgan的提示使用topenv()相當接近。但事實證明,在運行單元測試時,testthat,testthat之前包搜索路徑中的命名空間。

因此,這是當前的狀態:

.findmyname <- function() { 
    pkgs <- .packages() 

    if (pkgs [1] == "testthat") 
     pkgs [2] 
    else 
     pkgs [1] 
} 

此功能無論是從包內和tests/testthat.R發現包裝有問題的名稱。 (當然,任何.findmyname()包中定義的是tests/testthat.R在調用library之前不知道的...)

+1

看起來像第一到第三行可能可以替換爲'pkgs < - .packages()' –

+0

@RichardScriven:謝謝,更新。 – cbeleites

相關問題