Das Ziel ist es, zwei einfache Möglichkeiten zu haben, etwas Code zu erhalten, sagen wir func.R, der eine Funktion enthält. Der Aufruf R CMD BATCH func.R
initialisiert die Funktion und wertet sie aus. Innerhalb einer Sitzung initialisiert die Ausgabe von einfach die Funktion. Irgendeine Idee?Gibt es ein R-Äquivalent zum Python "if __name__ ==" __main__ ": main()"?
Antwort
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()
}
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/
Ich habe die andere Antwort, aber ich wusste nicht, dass Sie Argumente aus der Kommandozeile entweder passieren können. Das ist hilfreich. – gappy
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)) ' –
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")
}
Die einfachste Lösung, die für mich funktioniert, ist: 'if (length (grep ("- file = Whatever.R", BefehlArgs()))> 0) {print ("Run main")} ' –
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 .
Eine weitere Option ist:
#!/usr/bin/Rscript
# runs only when script is run by itself
if (sys.nframe() == 0){
# ... do main stuff
}
- 1. if __name__ == '__main__' in IPython
- 2. Warum macht es das? wenn - __name__ == '__main__'
- 3. Gibt es ein Perl-Pendant zu Pythons `if __name__ == '__main __'`?
- 4. Der Geltungsbereich von __name__ == __main__
- 5. PHP-Äquivalent von Pythons __name__ == "__main__"?
- 6. Powershell equivilent von Pythons, wenn __name__ == ‚__main__‘:
- 7. Python: Argarse importieren und initialisieren Nach wenn __name__ == '__main__'?
- 8. Python in Emacs: __name__ == '__main__', aber irgendwie nicht
- 9. wenn __name__ == '__main__' nicht funktioniert ipython
- 10. Python exec und __name__
- 11. `if __name__ == '__main __' Äquivalent in Ruby
- 12. Rubin entspricht Python __main__
- 13. Warum ist die Funktion main() nicht innerhalb des if '__main__' definiert?
- 14. Muss ich vor dem Aufruf von getLogger in Python explizit nach __name__ == "__main__" suchen?
- 15. Ist es üblich, eine Menge Code unter, wenn __name__ == ‚__main__‘ zu schreiben: Aussage
- 16. Es konnten keine Handler für den Logger "__main__" gefunden werden.
- 17. python joblib Parallel unter Windows funktioniert nicht einmal "wenn __name__ == '__main__':" hinzugefügt wird
- 18. Gibt es einen Namen für Variablen wie __name__ und __add__?
- 19. Warum haben Python-Instanzen kein Attribut __name__?
- 20. Python 2.7 - Call Main rekursiv
- 21. Wie kann ich __main__ von einem anderen Python-Modul ausführen?
- 22. Gibt es ein Äquivalent zum Python-Zweitakt-Befehl in redis?
- 23. Gibt es ein Python-Äquivalent zum Befehl 'which'?
- 24. Gibt es eine Möglichkeit, Pythons Bugmodul in __main__ und in der Befehlszeile gleich zu machen?
- 25. Was ist der Zweck von __name__?
- 26. Python: tatsächliche aktuelle Modul (nicht __main__)
- 27. versuchen zu verstehen __self__ == "__main__"
- 28. Gibt es in Python eine "Wildcard-Methode"?
- 29. Gibt es ein Python-Pendant zu HighLine?
- 30. Python-Hotshot Fehler ein einfaches Programm zum Profil versuchen
Ausgezeichnet, ich hatte keine Ahnung, dass es das gab.Ich denke, das wird die Art und Weise ändern, wie ich R. schreibe. – Vince
Mit der Rscript Shebang-Zeile und dem werden unsere R-Skripte pythischer sein als je zuvor! –
@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