2016-10-08 116 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)