2016-10-08 47 views
1

我有一個包,當您調用initialize函數時會生成一些函數。我在initialize()parent.frame中創建了這些功能,我猜這是全球環境。我想模擬正常的包行爲,允許您在加載後直接從包中調用函數,但在使用ls()列出工作空間內容時無需查看這些函數。例如,在做暴露函數沒有混亂ls()

library(ggplot2) 
ls() 

不返回geom_linegeom_point等,但你不必使用::調用這些功能。他們暴露給用戶,但不住在全球環境中。

有沒有一種聰明的方法可以讓我對initialize的調用產生的函數做同樣的事情,例如,通過定義zzz.ronLoadonAttach掛鉤中的環境或名稱空間?我想過試圖將函數環境設置爲包名稱空間,但似乎無法在加載後修改它。

編輯我正在使用的軟件包在這裏:https://github.com/mkoohafkan/arcpyrarcpy.initialize函數使用PythonInR連接到Python,導入arcpy包,然後爲函數列表創建接口。今天晚些時候我會嘗試創建一個簡化的虛擬包。

+1

得到舊的行爲後面,我編輯的鏈接我的問題。今天晚些時候我會嘗試創建一個更簡單的版本。 – mikeck

+1

以「。」開頭的函數名稱不會與'ls()'一起顯示。如果其他軟件包使用相同的技巧,不完全「聰明」,並不是很安全。 – Eric

+1

爲什麼你需要動態創建這些功能?爲什麼不讓它們存在於你的包名稱空間中,但是如果Python尚未初始化,它們會拋出一個錯誤? – shadowtalker

回答

0

所以我最終找到了一個同時使用兩種環境(謝謝@ssdecontrol!)和attach的解決方案。

f = new.env()     # create the environment f 
assign("foo", "bar", pos = f) # create the variable foo inside f 
ls()       # lists f 
ls(f)       # lists foo 
attach(f)      # attach f to the current environment 
foo        # foo can now be accessed directly 
## bar 
ls()       # but still only shows f 
rm(f)       # can even remove f 
foo        # and foo is still accessible 
## bar 

當然,也有some risks使用attach

redidarcpyr包使用環境而不是,但你可以通過做肯定@哈克-R

arcpy = arcpy_env() 
attach(arcpy)