63 votes

Existe-t-il un équivalent R du pythonique "if __name__ ==" __main__ ": main ()"?

L'objectif est d'avoir deux façons simples de source de code, disons func.R, contenant une fonction. L'appel de R CMD BATCH func.R initialise la fonction et évalue is. Dans une session, l'émission de source("func.R") initialise simplement la fonction. Une idée?

49voto

Harlan Points 5486

Je pense que la fonction interactive() pourrait fonctionner.

Cette fonction renvoie TRUE lorsque R est utilisé de manière interactive et FALSE sinon. Il suffit donc d'utiliser if(interactive())

5voto

Vince Points 3980

Vous pouvez passer des arguments dans R, et si un argument est présent, exécutez main (). Plus d'informations sur les arguments ici: http://yangfeng.wordpress.com/2009/09/03/including-arguments-in-r-cmd-batch-mode/

3voto

mcandre Points 6965

C'est beaucoup de travail, mais je l'ai finalement obtenu (et publié sur Rosetta Code ).

Cet exemple exporte une fonction appelée meaningOfLife . Lorsque le script est exécuté par lui-même, il s'exécute main . Lorsqu'il est importé par un autre fichier R, il ne s'exécute pas main .

 #!/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")
}
 

2voto

Paul4forest Points 75

J'ai posé une question similaire, dans une réponse, Matthew Plourde a suggéré d' utiliser getOption('run.main', default=TRUE) dans le script principal, puis de définir options(run.main=FALSE) avant d'appeler source() . Cela a fonctionné dans mon cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X