2014-10-30 62 views
1

在R包中,我試圖修補R中的base::library()函數,以專門設置搜索路徑中加載包的位置。我已經定義了幾種環境(全部命名爲env:<something>),並且希望確保將這些庫放置在搜索路徑的這些環境下。Patch base ::使用R中的包裝庫

# wrap around library function. 
library = function(..., pos = NULL) { 
    print("NEW LIBRARY FUNCTION!") 
    if (is.null(pos)) { 
    pos <- grep("env:", search()) 
    pos <- if (length(pos) == 0) 2 else max(pos) + 1 
    } 
    base::library(..., pos=pos) 
} 

當我分配在控制檯此功能,樣樣精運行:

> library(stats) 
[1] "NEW LIBRARY FUNCTION!" 
> eval(parse(text = "library(stats)")) 
[1] "NEW LIBRARY FUNCTION!" 
> eval(parse(text = "library(stats)"), envir = globalenv()) 
[1] "NEW LIBRARY FUNCTION!" 

當我定義我的包裏面上述包裝功能,構建它,並在新的R會話負載吧,如預期下執行:

> library(mypackage) 
> mypackage:::library(stats) 
[1] "NEW LIBRARY FUNCTION!" 

但是,使用eval()用函數內部envir論點mypackage,我的新DEFI時的library() nition沒有檢索:

# Functions defined in mypackage 
testlibrary1 = function(...) { 
    library(...) 
} 

testlibrary2 = function(code) { 
    eval(parse(text = code)) 
} 

testlibrary3 = function(code) { 
    eval(parse(text = code), envir = globalenv()) 
} 

在控制檯中,我得到如下結果:

> mypackage:::testlibrary1(stats) 
[1] "NEW LIBRARY FUNCTION!" 
> mypackage:::testlibrary2("library(stats)") 
[1] "NEW LIBRARY FUNCTION!" 
> mypackage:::testlibrary3("library(stats)") 
> 

最後一個函數,testlibrary3(),並沒有使用新的包裝函數。

我想要mypackage中的所有調用library()的函數都可以使用我的包裝函數。有人可以幫我嗎?

回答

1

我猜這個問題是下面的問題,但由於你的問題沒有包括一個完全可重現的例子(即通過在某個地方上傳軟件包)很難說清楚。

只要您的library函數未通過NAMESPACE從包中導出,就不可見。因此,唯一可用的library函數來評估是base::library()

請注意,儘管您的函數駐留在包的名稱空間中,但mypackage:::testlibraryX()的調用環境仍是全局環境。您的library功能不可用。嘗試導出,看看這是否有幫助。

+0

簡單地輸出功能做了訣竅,謝謝! – filipsch 2014-10-31 09:17:46