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?
Réponses
Trop de publicités?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/
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")
}
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.