¿Es if (interactivo ()) una R equivalente al python “if __name__ ==” __main__ “: main ()”?

Me gustaría que los scripts R tuvieran una función main () que se ejecute en modo interactivo. Pero la función main () no debe ejecutarse al obtener el archivo.

Ya hay una pregunta sobre esto y una muy buena respuesta sugiere usar la función interactiva (). Sin embargo, esto no funciona para mí. No tengo suficientes puntos de reputación para comentar o responder en esa pregunta. Así que hago la pregunta aquí de nuevo.

Escribo esto en script_1.r

 if(interactive()){ your main code here } 

Si utilizo knitr para renunciar a un documento html o pdf, obtengo el script. Este código bajo if(interactive()) no será ejecutado. Esto es bueno para mí, eso es lo que quiero.

Mi problema es que si source("script_1.r") de script_2.r en modo interactivo, aún se ejecutará el código debajo de esta parte if(interactive()) .

La mejor manera de obtener el tipo de control que busca es usar las opciones.

Por ejemplo, ‘script.r’ se vería así:

 main <- function() { message('main!') } if (getOption('run.main', default=TRUE)) { main() } 

Si está comprando el archivo en modo interactivo y no desea que se ejecute main , simplemente llame a options(run.main=FALSE) antes de llamar a source . Si está utilizando el script con knitr y desea que se ejecute main , no configure la opción, y se establecerá de forma predeterminada en TRUE . O si no desea que el main se ejecute con knitr, llame a las options(run.main=FALSE) antes de llamar.

Como habrás notado, no, no es lo mismo. if(interactive()) hace exactamente lo que dice el nombre, comprueba si el código se ejecuta en un shell interactivo. Ni mas ni menos.

No hay un equivalente directo de if __name__ == '__main__' de Python en R, ya que R no tiene el concepto de módulos de la misma manera que Python, y el source fuente se ejecuta directamente.

Sin embargo, puede escribir su propio comando de source para reemplazar el predeterminado y realizar la verificación necesaria.

Dicho esto, la pregunta que has vinculado contiene una respuesta que presenta una solución y esencialmente replica la funcionalidad de Python. Sin embargo, esto no parece ser lo que desea, ya que no funcionará como espera cuando lo invoca Knitr.