2012-01-05 22 views
17

Mam skrypt R, który trwa argumentów wiersza poleceń, gdzie górna linia jest:Przełącznik R skrypt z nieinteraktywny do interaktywnej

#!/usr/bin/Rscript --slave 

chciałem przerwać wykonywanie w funkcji (tak mogę interaktywnie użyj zmiennych danych, które zostały załadowane przez ten punkt, aby opracować następny fragment kodu, który muszę zapisać). Dodałem to wewnątrz funkcji:

browser() 

, ale zostanie zignorowany. Trochę wyszukiwania sugeruje, że może to być spowodowane tym, że program działa w trybie nieinteraktywnym. Ale jeszcze więcej wyszukiwań nie wyłapało, w jaki sposób przełączam skrypt w tryb nieinteraktywny, aby przeglądarka() działała. Coś w rodzaju funkcji browser_yes_I_really_mean_it().

P.S. Chcę uniknąć zmiany reszty skryptu, jeśli to w ogóle możliwe. Moje obecne podejście polega na kopiowaniu i wklejaniu fragmentów kodu, potrzebnych do przygotowania danych, w sesję interaktywną; ale ponieważ scenariusz staje się coraz bardziej złożony, staje się coraz bardziej nierozsądny.

AKTUALIZACJA: dla każdego, kto ma takie samo pytanie, wydaje się, że odpowiedź na pytanie brzmi, że jest to niemożliwe. Po uruchomieniu R w trybie nieinteraktywnym kostka jest rzucana. Podane odpowiedzi są zatem obejściem: albo zhackujesz swój kod (pamiętając o jego późniejszym wylogowaniu), albo też zmienisz, aby ułatwić sobie debugowanie. (Ten komentarz nie jest krytyką odpowiedzi, sugerowany refaktoryzacja i tak czyni kod czystszy).

+0

Przerwanie jednego naprawdę złożoną funkcję? Jeśli jest to kilka funkcji, możesz zrobić to, co sugeruje mdsumner, i złożyć kilka skryptów w jednym. Następnie po każdym rozsądnym punkcie przerwania zapisz dane na dysk. – Maiasaura

+0

Myślę, że próbujesz podążać tutaj przeciwko podstawowej logice. Twoja najwyższa linia oznacza "cokolwiek skrypt mówi, nie wchodź w interakcję". O to chodzi. Zmień tę linię - jak trudne może być? – reinierpost

+0

@reinierpost Dzięki, chociaż ta interpretacja 'Rscript - podrzędny' pojawia się jako nieudokumentowana. Strona podręcznika po prostu mówi "--slave" ma ją uspokoić. Ale do czego to zmienić? Kiedy używam samego 'Rscript', to' browser() 'uruchamia, ale wychodzi ze skryptu, nie dając mi sesji interaktywnej. –

Odpowiedz

20

Czy możesz po prostu odpalić R i pobrać plik?

R 
source("script.R") 
+1

Dzięki, ale próbowałem tego.Narzeka na brakujące argumenty linii poleceń, a następnie wychodzi. –

+0

Dlaczego więc nie po prostu ** najpierw ** wkleja argumenty wiersza poleceń do aktywnej sesji R, a ** następnie ** źródło w "script.R". Po dodaniu tego jednego szczegółu sugestia @ mdsumnera wydaje się całkiem rozsądna. –

+0

Lub utwórz dwa skrypty R, jeden odczytujący argumenty wiersza cmd i źródła drugi. W pierwszym skrypcie można ustawić opcję globalną zwaną interaktywną (za pomocą funkcji opcji). W drugim skrypcie możesz zaznaczyć tę opcję (używając getOption, myślę) i jeśli jest FALSE, podaj kilka wartości domyślnych dla opcji, które przechodzą przez cmdline. W ten sposób możesz interaktywnie debugować swoją sekundę, a następnie uruchomić ją partiami z pierwszą. –

2

W uzupełnieniu do poprzedniej odpowiedzi, chciałbym stworzyć Toplevel funkcję (np DoStuff), która wykonuje analizę chcesz wykonać w partii. Funkcja przyjmuje opcje wiersza cmd jako dane wejściowe. W skrypcie wsadowym pozyskujesz skrypt zawierający tę funkcję i wywołujesz ją. W ten sposób możesz łatwo uruchomić funkcję w trybie interaktywnym i użyć np. przeglądarka().

4

następującą odpowiedź mdsumner, w I edytowane mój skrypt tak:

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(...)") 
     } 
    } 

Wtedy żadna inna zmiana była potrzebna, i udało mi się zrobić:

R 
> argv=c('a','b','c','d') 
> source("script.R") 
Powiązane problemy