if( length(grep("^myfuncs$",search()))==0 )
attach("myfuncs",pos=2)
for( f in list.files("functions","\\.r$",full=TRUE) )
sys.source(f,pos.to.env(grep("^myfuncs$",search())))
当您进行更改时,您总是可以使用相同的代码行重新进行资源分配,或者使用
evalq(f <- function(x) x * 2, pos.to.env(grep("^myfuncs$",search())))
我不知道这是否是您的情况,但是当我在 R 中工作时,我很少在开始时考虑一个大型的复杂程序。我通常从一个脚本开始,并将代码分成逻辑上可分的单元,通常使用函数。将数据操作和可视化代码放在各自的函数中等等。这些函数被分组在文件的一个部分中(数据操作在顶部,然后是可视化,等等)。最终,您需要考虑如何更容易地维护您的脚本并降低缺陷率。
函数的细粒度和粗粒度会有所不同,有各种各样的经验法则: 例如15行代码,或者“一个函数应该负责执行一个由其名称标识的任务”,等等。你的情况会有所不同。由于 R 不支持引用调用,所以当涉及到传递数据框架或类似结构时,我通常不会让函数粒度太细。但这可能是对我刚开始使用 R 时一些愚蠢的性能错误的过度补偿。
如果要部署函数,那么需要开始考虑包。由于各种原因,我不会在生产环境中部署 R 代码,也不会为了其他人的重用而部署 R 代码(简而言之: org 文化倾向于使用其他语言,关注性能、 GPL 等)。另外,我倾向于不断地改进和添加源文件集合,并且在进行更改时我宁愿不处理包。因此,你应该查看其他包相关的答案,如德克的,在这方面的更多细节。
最后,我认为你的问题不一定特别针对 R。我真的推荐阅读 Steve McConnell 的代码完成,它包含了很多关于这些问题和编码实践的智慧。
我相信 R 在生产环境中的使用越来越多,因此对可重用代码的需求比以前更大了。我发现这个解释器比以前健壮多了。毫无疑问,R 比 C 慢100-300倍,但通常瓶颈集中在几行代码上,这些代码可以委托给 C/C + + 。我认为将 R 在数据处理和统计分析方面的优势委托给另一种语言是错误的。在这些情况下,性能损失很低,而且在任何情况下都值得节省开发工作。如果仅仅是执行时间的问题,我们都会编写汇编程序。
我也一直在寻找正确的工作流程的圣杯放在一起的 R 大型项目。去年,我发现了一个叫 RSuite的软件包,当然,这就是我要找的。这个 R 包是为部署大型 R 项目而明确开发的,但是我发现它可以用于小型、中型和大型 R 项目。我将在一分钟内(下面)给出现实世界示例的链接,但首先,我想解释用 rsuite构建 R 项目的新范例。
注意,我不是 rsuite的创建者或开发者。
我们在使用 RStudio 时做项目的方法都是错误的; 我们的目标不应该是创建一个项目或包,而应该是创建一个更大范围的项目或包。在 rSuite 中,您可以创建一个超级项目或主项目,其中包含所有可能的组合中的标准 R 项目和 R 包。
通过拥有一个 R 超级项目,您不再需要 Unix make来管理底层的 R 项目; 您在顶层使用 R 脚本。我给你看看。当您创建一个 rSuite 主项目时,您会得到以下文件夹结构: