2010-06-03 10 views

Respuesta

37

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

Esta función devuelve TRUE cuando R se usa interactivamente y FALSE de lo contrario. Así que sólo tiene que utilizar if (interactive())

es decir, el equivalente es

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

Excelente, no tenía idea de que esto existiera. Creo que esto cambiará la forma en que escribo R. – Vince

+3

Con la línea Rscript shebang y este nuestros R scripts serán más pitónicos que nunca! –

+1

@gappy ¿Puedes actualizar esta respuesta? Siento que esta respuesta no responde a su pregunta en el título. Principalmente le dice si el archivo R se obtiene de la línea de comandos o usando Rscript. – Navneet

5

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

+0

que votaron la otra respuesta, pero yo no sabía que podría pasar argumentos desde la línea de comandos tampoco. Eso es útil. – gappy

+1

Desde principios de 2009, ha sido posible ejecutar scripts R con una línea shebang, p. '#!/usr/bin/Rscript --vanilla' directamente desde la línea de comando: p. ejecute 'chmod 700 my_script.r' para hacerlo ejecutable, y luego puede ejecutar el script con'./my_script.r' (dentro del script lee los argumentos de la misma manera que en el enlace de arriba, por 'args = (commandArgs (VERDADERO) ' –

2

Es un montón de trabajo, pero finalmente lo consiguió (y publicada en Rosetta Code).

Este ejemplo exporta una función llamada meaningOfLife. Cuando el script se ejecuta solo, ejecuta main. Cuando se importa 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") 
} 
+0

La solución más simple que funciona para mí es esta: 'if (length (grep ("- file = Whatever.R", commandArgs()))> 0) {print ("Ejecutar principal")} ' –

1

me hizo una pregunta similar, usando in an answer, Matthew Plourde suggestedgetOption('run.main', default=TRUE) en el script principal, y luego poner options(run.main=FALSE) antes de llamar source(). Esto funcionó en mi caso.

De lo contrario, un patrón simple cuando tiene un script R creando un conjunto de funciones y desea escribir unas líneas al final del script para experimentar con el uso de una función: coloque estas líneas adicionales en un bloque if(FALSE){} .

1

Otra opción es:

#!/usr/bin/Rscript 

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