我有一个在调用initialize
函数时生成一些函数的包。我在parent.frame
的{{1}}中创建了这些函数,我猜这是全局环境。我想模拟正常的包行为,允许您在加载后直接从包中调用函数,但是在使用initialize()
列出工作空间内容时无需查看这些函数。例如,做
ls()
不会返回library(ggplot2)
ls()
,geom_line
等,但您不必使用geom_point
来调用这些功能。它们暴露给用户,但不会生活在全球环境中。
我是否有一种聪明的方法可以为调用::
生成的函数执行相同的操作,例如通过在initialize
和zzz.r
或onLoad
挂钩中定义环境或命名空间?我想过尝试将函数环境设置为包命名空间,但似乎在加载后无法修改包命名空间。
编辑我正在处理的软件包在这里:https://github.com/mkoohafkan/arcpyr。 onAttach
函数使用PythonInR连接到Python,导入arcpy.initialize
包,然后为函数列表创建接口。我今天晚些时候会尝试创建一个简化的虚拟包。
答案 0 :(得分: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
当然,attach
使用some risks。
我redid arcpyr
包使用环境代替,但你可以通过
arcpy = arcpy_env()
attach(arcpy)