2016-10-16 32 views
1

我採購UTIL在生產函數到環境中封裝(和組)的輔助功能:將庫加載到現有環境中(相當於「源」的「本地」參數)?

助手文件:

# File: Helper.R 
hello <- function() { 
    print("Hello world") 
} 

客戶:

helper <- new.env() 
source("Helper.R", local=helper) 
helper$hello() # call the helper function 

我如何遷移我源「Helper.R」到庫中,而不會打破源功能的調用?

我想有像

helper <- new.env() 
library(Helper, local=helper) 
helper$hello() # call the helper function (loaded from the library now) 

一種方法可以做到這一點?

+0

另一種方法是將源代碼放入命名空間(而不是環境)並使用'::'而不是'$',但是這個問題沒有令人滿意的答案:http://stackoverflow.com/q/ 15620404/4468078 –

回答

1

您可以使用在‹modules› packageimport_package功能(一個CRAN上,這是不同的!)。

那麼下面本地附加一個包:

modules::import_packge('pkg', attach = TRUE) 

或者,並有可能更接近你真正想做的事,你可以按如下方式使用它:

pgk = modules::import_package('pkg') 

現在包根本沒有連接,其導出的對象可以通過pkg$obj訪問。這與R的基本功能loadNamespace功能有點類似,但在幕後會做得更多。

最後,請考慮不要將您的幫手代碼放入包中,而應將其作爲模塊分發。畢竟這是 包的設計目的。因此,而不是創建一個包,剛剛分發您 helper.r代碼文件(或文件夾),然後按如下方式使用它:

helper = modules::import('helper') 

見包README和暗角的詳細說明。

+0

很棒的包裝,使功能註釋成爲幫助的功能(「源」不能這樣做)。我希望'modules'軟件包很快能夠進入到CRAN中 –

0

另一種方式可以是:

# getNamespace returns the environment representing the name space name. The namespace is loaded if necessary. 
# Internal function to support reflection on namespace objects! 
env <- getNamespace("data.table") 
cars <- env$as.data.table(mtcars) 

這方面的例子,使包data.table通過環境變量env可用的所有對象。

注意:它使用內部R函數(不知道變化的風險真的很大)。

0

我已經找到另一個包名爲import(類似於 「模塊」),允許導入包到一個環境:

https://github.com/smbache/import

這個包還對CRAN:

install.packages("import") 

它允許導入選定的,全部導出(「公共」)或全部(甚至不導出)包的功能。

實施例:

import::from(dplyr, arrange, .into = "datatools") 

import::from函數是getExportedValue一個方便的包裝。

1

添加到建議列表中,您還可以考慮在CRAN上使用modules軟件包(請注意,我是作者)。當你有你Helper.R文件有:

hello <- function() { 
    print("Hello world") 
} 

可以使用

helper <- modules::use("Helper.R") 
helper$hello() 

封裝在自己的環境中您的輔助功能。該包還提供了一些操作模塊(導入/導出)的本地名稱空間的功能。

相關問題