Ответ 1
Можете ли вы просто запустить R и исправить файл?
R
source("script.R")
У меня есть R script, который принимает аргументы командной строки, где верхняя строка:
#!/usr/bin/Rscript --slave
Я хотел прервать выполнение в функции (чтобы я мог интерактивно использовать переменные данных, которые были загружены этой точкой, чтобы выработать следующий бит кода, который мне нужно написать). Я добавил это внутри рассматриваемой функции:
browser()
но он игнорируется. Немного о поиске говорит, что это может быть потому, что программа работает в неинтерактивном режиме. Но даже больше поиска не отслеживает, как я переключаю script вне неинтерактивный режим, чтобы браузер() работал. Что-то вроде функции browser_yes_I_really_mean_it()
.
P.S. Я хочу, чтобы избежать изменения остальных script, если это вообще возможно. Мой текущий подход заключается в копировании и вставке фрагментов кода, необходимых для подготовки данных, в интерактивную сессию; но по мере того, как script становится все более сложным, становится все более и более необоснованным.
ОБНОВЛЕНИЕ: для кого-то другого с тем же вопросом, кажется, ответ на фактический вопрос заключается в том, что это невозможно. Как только вы запустите R в неинтерактивном режиме, штамп будет отлит. Таким образом, данные ответы обходные: либо вы взломаете свой код (помните, что потом распаковываете его), либо рефакторинг облегчает отладку. (Этот комментарий не предназначен для критики ответов, предлагаемый рефакторинг делает очиститель кода в любом случае.)
Можете ли вы просто запустить R и исправить файл?
R
source("script.R")
После ответа mdsumner я редактировал свой script следующим образом:
if(!exists("argv")){
argv=commandArgs(TRUE)
if(length(argv)!=4)usage_and_exit()
}else{
if(length(argv)!=4){
stop("Must set argv as a 4 element vector. E.g. argv=c(...)")
}
}
Тогда никаких других изменений не было, и я смог:
R
> argv=c('a','b','c','d')
> source("script.R")
В дополнение к предыдущему ответу, я бы создал функцию верхнего уровня (например, doStuff), которая выполняет анализ, который вы хотите выполнить в пакетном режиме. Функция принимает параметры линии cmd в качестве входных данных. В пакете script вы отправляете script, который содержит эту функцию и вызывает ее. Таким образом, вы можете легко запустить функцию в интерактивном режиме и использовать, например, браузер().