¿Hay un equivalente en R de pythonic “si __name__ ==” __main__ “: main ()”?

El objective es tener dos formas sencillas de obtener código, por ejemplo, func.R, que contiene una función. Llamando a R CMD BATCH func.R inicializa la función y evalúa es. Dentro de una sesión, la source("func.R") emisora source("func.R") simplemente inicializa la función. ¿Alguna idea?

Creo que la función interactive() podría funcionar.

Esta función devuelve TRUE cuando R se usa interactivamente y FALSE contrario. Así que solo usa if (interactive())

es decir, el equivalente es

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

Otra opción es:

 #!/usr/bin/Rscript # runs only when script is run by itself if (sys.nframe() == 0){ # ... do main stuff } 

Podría pasar argumentos a R, y si un argumento está presente, ejecute main (). Más información sobre los argumentos aquí: http://yangfeng.wordpress.com/2009/09/03/including-arguments-in-r-cmd-batch-mode/

Es mucho trabajo, pero finalmente lo conseguí (y lo publiqué en Rosetta Code ).

Este ejemplo exporta una función llamada meaningOfLife . Cuando el script se ejecuta solo, ejecuta main . Cuando es importado por otro archivo R, no se ejecuta 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") } 

En una respuesta, hice una pregunta similar . Matthew Plourde sugirió usar getOption('run.main', default=TRUE) en el script principal y luego configurar las options(run.main=FALSE) antes de llamar a source() . Esto funcionó en mi caso.

De lo contrario, es un patrón más sencillo cuando tiene un script R que crea un grupo de funciones y desea escribir algunas líneas al final del script para experimentar con el uso de una función: coloque estas líneas adicionales en un if(FALSE){} bloquear.