Переключить сценарий R с неинтерактивного на интерактивный - PullRequest
20 голосов
/ 05 января 2012

У меня есть R-скрипт, который принимает аргументы командной строки, где верхняя строка:

#!/usr/bin/Rscript --slave

Я хотел прервать выполнение в функции (чтобы я мог в интерактивном режиме использовать переменные данных, которые были загружены этой точкой, для обработки следующего бита кода, который мне нужно написать). Я добавил это внутри рассматриваемой функции:

browser()

но это игнорируется. Немного поиска предполагает, что это может быть потому, что программа работает в неинтерактивном режиме. Но даже в процессе поиска не было обнаружено, как я переключаю сценарий в неинтерактивный режим, чтобы браузер () работал. Что-то вроде browser_yes_I_really_mean_it() функции.

P.S. Я хочу избежать изменения остальной части сценария, если это возможно. Мой текущий подход заключается в копировании и вставке фрагментов кода, необходимых для подготовки данных, в интерактивный сеанс; но по мере того, как сценарий становится все более и более сложным, это становится все более и более необоснованным.

ОБНОВЛЕНИЕ: для любого другого с тем же вопросом, кажется, ответ на фактический вопрос - то, что это невозможно. Как только вы запускаете R в неинтерактивном режиме, бросается кубик. Таким образом, приведенные ответы являются обходными путями: либо вы взламываете свой код (не забывая впоследствии его отменить), либо реорганизуете, чтобы упростить отладку. (Этот комментарий не предназначен для критики ответов; предложенный рефакторинг в любом случае делает код чище.)

Ответы [ 3 ]

22 голосов
/ 05 января 2012

Можете ли вы просто запустить R и получить исходный файл?

R
source("script.R")
5 голосов
/ 06 января 2012

После ответа mdsumner я отредактировал свой скрипт следующим образом:

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")
2 голосов
/ 05 января 2012

В дополнение к предыдущему ответу я бы создал функцию верхнего уровня (например, doStuff), которая выполняет анализ, который вы хотите выполнить в пакетном режиме.Функция принимает параметры строки cmd в качестве входных данных.В пакетном скрипте вы создаете скрипт, который содержит эту функцию, и вызываете ее.Таким образом, вы можете легко запустить функцию в интерактивном режиме и использовать, например, browser ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...