我发现自己处于完成大量分析的位置,现在需要以稍微不同的输入假设重复分析.
在这种情况下,分析涉及聚类分析,绘制几个图,以及导出聚类ID和其他感兴趣的变量.关键是它是一个广泛的分析,需要重复和比较两次.
我考虑过:
source.这可行,但似乎非常丑陋和次优.分析的目的是用一组对象(在列表中或在单独的输出文件中)完成,我可以进一步分析差异.
处理这类问题的好策略是什么?
Nic*_*bbe 17
使代码可重用需要一些时间,精力并且还有一些额外的挑战,比如你自己提到的.
是否投资的问题可能是信息学中的关键问题(如果不是在很多其他领域):我是否编写了一个脚本来以类似的方式重命名50个文件,或者我是否继续手动重命名它们.
我相信,答案是非常个人化的,即便如此,也是个案不同.如果您在编程上很容易,那么您可能会更快地决定使用重用路由,因为您的工作量相对较低(即便如此,程序员通常也喜欢学习新的技巧,因此这是一个隐藏的,通常适得其反的动机).
也就是说,在您的特定情况下:我会选择采购选项:由于您计划仅重复使用代码2倍,因此可能会浪费更多精力(您表明分析相当广泛).那么,如果它不是一个优雅的解决方案呢?没有人会看到你这样做,每个人都会对快速的结果感到满意.
如果在一年左右的时间内重复使用率高于预期,那么您仍然可以进行投资.到那时,您还将(至少)有三种情况可以将您的代码的重写和时髦可重用版本的结果与您当前的结果进行比较.
如果/当我事先知道我将重用代码时,我会在开发它时考虑到这一点.无论哪种方式,我几乎都没有编写不在函数中的代码(好吧,除了SO和其他开箱即用的分析的两行):我发现这使我更容易构建我的想法.
如果可能的话,在外部参数文件中设置不同的设置/运行/实验参数.然后,您可以获取代码,调用函数,甚至使用包,但操作由一小组外部定义的参数确定.
例如,JSON对此非常有效,RJSONIO而且rjson包允许您将文件加载到列表中.假设您将其加载到名为parametersNN.json的列表中.一个例子如下:
{
"Version": "20110701a",
"Initialization":
{
"indices": [1,2,3,4,5,6,7,8,9,10],
"step_size": 0.05
},
"Stopping":
{
"tolerance": 0.01,
"iterations": 100
}
}
Run Code Online (Sandbox Code Playgroud)
保存为"parameters01.json"并加载为:
library(RJSONIO)
Params <- fromJSON("parameters.json")
Run Code Online (Sandbox Code Playgroud)
然后你就开始跑步了.(注意:我喜欢在我的参数文件中使用唯一版本#s,以便我可以稍后识别该集合,如果我正在查看R中的"参数"列表.)只需调用脚本并指向参数文件,例如:
Rscript --vanilla MyScript.R parameters01.json
Run Code Online (Sandbox Code Playgroud)
然后,在程序中,从commandArgs()函数中识别参数文件.
稍后,您可以将代码分解为函数和包,但这可能是在短期内使vanilla脚本易于概括的最简单方法,并且这是一个长期的好习惯,因为代码应该与规范分开运行/数据集/实验相关参数.
编辑:更准确地说,我甚至会在JSON中指定输入和输出目录或文件(或命名模式/前缀).这使得一组参数如何导致一个特定输出集非常清楚.介于两者之间的所有内容都只是使用给定参数化运行的代码,但代码不应该真正改变太多,是吗?
更新:三个月,以及数千次运行,比我之前的答案更明智,我会说JSON中的参数外部存储对于1-1000个不同的运行非常有用.当参数或配置数量在数千及以上时,最好切换到使用数据库进行配置管理.每个配置都可能源自JSON(或XML),但是能够解决不同的参数布局需要更大规模的解决方案,像SQLite(via RSQLite)这样的数据库是一个很好的解决方案.
我意识到这个答案对于原始问题来说是过度的 - 如何重复工作几次,只需要进行一些参数更改,但在正在进行的研究中扩展到数百或数千个参数更改时,需要更多的工具.:)