El objetivo es tener dos formas sencillas de obtener un código, por ejemplo func.R, que contenga una función. Llamar al R CMD BATCH func.R
inicializa la función y evalúa is. Dentro de una sesión, al emitir simplemente se inicializa la función. ¿Alguna idea?¿Hay un equivalente R de la pitonica "si __name__ ==" __main__ ": main()"?
Respuesta
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()
}
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/
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
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) ' –
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")
}
La solución más simple que funciona para mí es esta: 'if (length (grep ("- file = Whatever.R", commandArgs()))> 0) {print ("Ejecutar principal")} ' –
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){}
.
Otra opción es:
#!/usr/bin/Rscript
# runs only when script is run by itself
if (sys.nframe() == 0){
# ... do main stuff
}
- 1. node.js equivalente de python si __name__ == '__main__'
- 2. PHP equivalente de Python's __name__ == "__main__"?
- 3. ¿Por qué hace esto? si - __name__ == '__main__'
- 4. Powershell equivilent de Python si __name__ == '__main__':
- 5. Usar si __name__ == '__main__': para pruebas
- 6. El alcance de if __name__ == __main__
- 7. Rubí equivalente a Python __main__
- 8. `if __name__ == '__main __'` equivalente en Ruby
- 9. ¿Cómo configuro __name__ a '__main__' cuando uso IronPython alojado?
- 10. ¿Por qué la función main() no está definida dentro de if '__main__'?
- 11. ¿Por qué usar def main()?
- 12. manera pitonica para verificar si algo existe?
- 13. __main__ y de alcance en Python
- 14. ¿Cómo importar un módulo como __main__?
- 15. ¿Hay un R Markdown equivalente a \ Sexpr {} en Sweave?
- 16. ¿Hay un equivalente de PHP para `public static main (String [] args)` en Java?
- 17. ¿Qué significa esto salir (main())
- 18. ¿Hay un equivalente Java de frexp?
- 19. ¿Hay un equivalente de C# de m_nCmdShow?
- 20. R equivalente a la estructura MATLAB?
- 21. ¿Hay un equivalente de Cake para Python?
- 22. ¿Hay un método equivalente LINQ?
- 23. ¿Por qué cambia el valor de __name__ después de la asignación a sys.modules [__ name__]?
- 24. Python IDLE equivalente de CTRL-R en R
- 25. ¿Hay un equivalente de Profiler para MySql?
- 26. ¿Hay un equivalente binario de System.Text.StringBuilder?
- 27. ¿Qué sucede si main() no devuelve un valor int?
- 28. ¿Hay un equivalente de "esto" en Powershell?
- 29. ¿Hay un equivalente de ucwords en java
- 30. ¿Hay un equivalente de Make en Windows?
Excelente, no tenía idea de que esto existiera. Creo que esto cambiará la forma en que escribo R. – Vince
Con la línea Rscript shebang y este nuestros R scripts serán más pitónicos que nunca! –
@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