Если это вообще возможно, установите параметры, которые отличаются между наборами / прогонами / экспериментами во внешнем файле параметров. Затем вы можете получить исходный код, вызвать функцию, даже использовать пакет, но операции определяются небольшим набором внешних параметров.
Например, JSON отлично подходит для этого, а пакеты RJSONIO
и rjson
позволяют загружать файл в список. Предположим, вы загрузили его в список с именем параметровNN.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
}
}
Сохраните это как "parameters01.json" и загрузите как:
library(RJSONIO)
Params <- fromJSON("parameters.json")
и все готово. (NB: мне нравится использовать уникальные версии #s в моих файлах параметров, просто чтобы я мог определить набор позже, если я смотрю на список «параметров» в R.) Просто вызовите ваш скрипт и укажите на параметры файл, например:
Rscript --vanilla MyScript.R parameters01.json
затем в программе определите файл параметров из функции commandArgs()
.
Позже вы можете разбить код на функции и пакеты, но это, вероятно, самый простой способ сделать ванильный скрипт обобщаемым в краткосрочной перспективе, и это хорошая практика в долгосрочной перспективе, так как код должен быть отделен от спецификация параметров запуска / набора данных / эксперимента.
Редактировать: если быть более точным, я бы даже указал входные и выходные каталоги или файлы (или имена / префиксы имен) в JSON. Это очень ясно показывает, как один набор параметров привел к одному конкретному выходному набору. Все, что между ними, - это просто код, который выполняется с заданной параметризацией, но код не должен сильно меняться, не так ли?
Обновление:
Через три месяца и многие тысячи прогонов, мудрее моего предыдущего ответа, я бы сказал, что внешнее хранение параметров в JSON полезно для 1-1000 различных прогонов. Когда количество параметров или конфигураций исчисляется тысячами и более, лучше перейти на использование базы данных для управления конфигурацией. Каждая конфигурация может исходить из JSON (или XML), но для того, чтобы справиться с различными макетами параметров, требуется решение большего масштаба, для которого база данных, такая как SQLite (через RSQLite
), является хорошим решением.
Я понимаю, что этот ответ является избыточным для первоначального вопроса - как повторить работу только пару раз, с несколькими изменениями параметров, но при масштабировании до сотен или тысяч изменений параметров в текущих исследованиях необходимы более обширные инструменты , :)