2010-06-03 3 views

Antwort

37

Ich denke, dass die interactive() Funktion funktionieren könnte.

Diese Funktion gibt TRUE zurück, wenn R interaktiv verwendet wird, andernfalls FALSE. Also nur if (interactive())

verwenden das heißt das Äquivalent ist

if (!interactive()) { 
    main() 
} 
+0

Ausgezeichnet, ich hatte keine Ahnung, dass es das gab.Ich denke, das wird die Art und Weise ändern, wie ich R. schreibe. – Vince

+3

Mit der Rscript Shebang-Zeile und dem werden unsere R-Skripte pythischer sein als je zuvor! –

+1

@gappy Kannst du update this answer? Ich glaube, diese Antwort beantwortet nicht Ihre Frage im Titel. Sie sagt Ihnen hauptsächlich, ob die R-Datei auf Kommandozeile oder mit Rscript bezogen wird. – Navneet

5

Sie könnten Argumente in R übergeben, und wenn ein Argument vorhanden ist, führen Sie main() aus. Mehr über Argumente hier: http://yangfeng.wordpress.com/2009/09/03/including-arguments-in-r-cmd-batch-mode/

+0

Ich habe die andere Antwort, aber ich wusste nicht, dass Sie Argumente aus der Kommandozeile entweder passieren können. Das ist hilfreich. – gappy

+1

Seit etwa Anfang 2009 ist es möglich, R-Skripte mit einer Shebang-Zeile, z. '#!/usr/bin/Rscript --vanilla' direkt von der Befehlszeile: z. Führen Sie 'chmod 700 my_script.r' aus, um es ausführbar zu machen, und dann können Sie das Skript mit'./my_script.r' ausführen (innerhalb des Skripts lesen Sie die Argumente genauso wie in der obigen Verknüpfung, mit 'args = (commandArgs (TRUE)) ' –

2

Es ist eine Menge Arbeit, aber ich habe es endlich (und veröffentlicht bei Rosetta Code). In diesem Beispiel wird eine Funktion namens meaningOfLife exportiert. Wenn das Skript selbst ausgeführt wird, wird main ausgeführt. Wenn es von einer anderen R-Datei importiert wird, wird main nicht ausgeführt.

#!/usr/bin/Rscript 

meaningOfLife <- function() { 
    42 
} 

main <- function(program, args) { 
    cat("Main: The meaning of life is", meaningOfLife(), "\n") 
} 

getProgram <- function(args) { 
    sub("--file=", "", args[grep("--file=", args)]) 
} 

args <- commandArgs(trailingOnly = FALSE) 
program <- getProgram(args) 

if (length(program) > 0 && length(grep("scriptedmain", program)) > 0) { 
    main(program, args) 
    q("no") 
} 
+0

Die einfachste Lösung, die für mich funktioniert, ist: 'if (length (grep ("- file = Whatever.R", BefehlArgs()))> 0) {print ("Run main")} ' –

1

fragte ich eine ähnliche Frage, in an answer, Matthew Plourde suggestedgetOption('run.main', default=TRUE) im Haupt Skript und dann options(run.main=FALSE) Einstellung vor source() aufrufen. Das hat in meinem Fall funktioniert.

Ansonsten ist ein einfacheres Muster, wenn Sie ein R-Skript erstellen eine Reihe von Funktionen und Sie möchten ein paar Zeilen am Ende des Skripts zu experimentieren mit der Verwendung einer Funktion zu schreiben: diese zusätzlichen Zeilen in einen if(FALSE){} Block .

1

Eine weitere Option ist:

#!/usr/bin/Rscript 

# runs only when script is run by itself 
if (sys.nframe() == 0){ 
# ... do main stuff 
} 
Verwandte Themen