2009-10-26 3 views
6

Wie debugge ich Rscripts, die von der Befehlszeile ausgeführt werden?debugging littler/Rscripts

ich derzeit das getopt Paket bin mit Kommandozeilen-Optionen zu übergeben, Mutter, wenn ein Fehler da ist, ist es schwer für mich zu:

  1. sehen, was genau schief gelaufen ist;
  2. Debug interaktiv in R (da das Skript Kommandozeilenoptionen erwartet.)

Teilt Beispielcode und bereit, jeden haben?

Antwort

6

Sie könnten Ihre Befehlszeilenargumente in eine interaktive Shell mit --args übergeben und dann das Skript ("") quellen.

$ R --args -v 

R version 2.8.1 (2008-12-22) 
Copyright (C) 2008 The R Foundation for Statistical Computing 
ISBN 3-900051-07-0 

R is free software and comes with ABSOLUTELY NO WARRANTY. 
You are welcome to redistribute it under certain conditions. 
Type 'license()' or 'licence()' for distribution details. 

R is a collaborative project with many contributors. 
Type 'contributors()' for more information and 
'citation()' on how to cite R or R packages in publications. 

Type 'demo()' for some demos, 'help()' for on-line help, or 
'help.start()' for an HTML browser interface to help. 
Type 'q()' to quit R. 

> require(getopt) 
Loading required package: getopt 
> opt = getopt(c(
+ 'verbose', 'v', 2, "integer" 
+)); 
> opt 
$verbose 
[1] 1 
> source('my_script.R') 

Sie könnten nun die alte browser() - Funktion zum Debuggen verwenden.

+0

ich Ihren Rat versucht und bekam dieses :-('> R -i indivA12_AATAAG -d hmm_data/indivA12_AATAAG -c alle *** Weitere Befehlszeilenargumente ('-i indivA12_AATAAG -c all') disregarded' – Greg

+0

Ok, Vergiss es, ich habe den Teil vermisst, in dem du gesagt hast: --args – Greg

+0

Nun öffnet sich R, aber ich erhalte diesen Fehler: '> source ('msg/write-hmm-data.R') Fehler in if (file ==" ") file <- stdin() else {: Argument hat die Länge Null > ' – Greg

3

Ich benutze entweder Old-School-Druckanweisungen oder interaktive Analyse. Dafür speichere ich zunächst den Zustand mit save() und lade diesen dann in eine interaktive Sitzung (für die ich Emacs/ESS verwende). Dies ermöglicht eine interaktive Arbeit mit dem Skript-Code Zeile für Zeile.

Aber ich schreibe/teste/debugge den Code oft im interaktiven Modus, bevor ich ihn in einem kleinen Skript deploye.

3

Eine weitere Option ist die Arbeit mit den Optionen (Fehler) -Funktionalität. Hier ist ein einfaches Beispiel:

options(error = quote({dump.frames(to.file=TRUE); q()})) 

Sie können so aufwendig ein Skript erstellen, wie Sie auf eine Fehlerbedingung möchten, so sollten Sie nur noch entscheiden, welche Informationen Sie für das Debuggen benötigen.

Andernfalls, wenn bestimmte Bereiche betroffen sind (z. B. Herstellen einer Verbindung mit einer Datenbank), dann wickeln Sie sie in eine tryCatch() - Funktion ein.