【发布时间】:2013-03-25 05:14:51
【问题描述】:
在重组我的代码库时,我想清理我的代码共享机制。到目前为止,我将source 用于许多小型、大部分独立的功能模块。
但是,这种方法存在许多问题,其中包括
- 缺乏循环测试(意外循环
source链), - 正确指定包含路径所需的复杂语法(
chdir=TRUE参数,硬编码路径), - 潜在的名称冲突(重新定义对象时)。
理想情况下,我想获得与 Python 模块机制类似的东西。 R 包机制在这里会有点矫枉过正:我确实不想要生成嵌套的路径层次结构、包含大量元数据的多个文件并手动构建包只是为了得到一个小的、自包含、可重用的代码模块。
现在我使用的是 sn-p 代码,它可以让我解决上面提到的前两个问题。包含的语法如下:
import(functional)
import(io)
import(strings)
... 并且模块被定义为驻留在本地路径中的简单源文件。 The definition of import is straightforward 但我无法解决第三点:我想将模块导入单独的命名空间,但据我所知,命名空间查找机制与包非常紧密。没错,我可以覆盖 `::` 或 getExportedValue 或者 asNamespace 和 isNamespace,但感觉很脏,并且有可能破坏其他包。
【问题讨论】:
-
您能否详细说明为什么将每个文件的内容添加到搜索路径上的单独环境中(如
?sys.source的示例所示)是不够的? -
@Joshua 这就是我现在正在做的事情(我的例子被简化了)——我认为有一种明确限定命名空间的方法很好。当然我可以对
get和assign做同样的事情,但是::的语法要好一些。 -
我很困惑,因为您的
import函数没有这样做。如果将每个文件的内容放在搜索路径上的单独环境中,则可以使用$运算符(例如strings$concatenate())访问特定环境。 -
我认为这需要更多的答案来责备 OP 想要避免创建包的开销;=)
标签: r module namespaces