2010-05-05 7 views
25

A menudo ejecuto scripts R largos cuando comienzo mi entorno R. Me gustaría poder cargar/ejecutar el script R en Emacs/ESS y continuar otro trabajo en otro buffer.¿Cómo puedo crear el fondo del proceso R en ESS/Emacs?

Cuando presiono C-g o C-c C-c, el proceso se interrumpe y debo reiniciar la secuencia de comandos.

¿Cuál es la mejor manera de procesar el proceso R en ESS/Emacs?

EDITAR: Gracias por sus respuestas y comentarios, pero ninguno de ellos aborda el hecho de que Emacs se congela cuando carga/ejecuta un script grande y no puede cambiar el búfer.

Supongo que mi pregunta es un poco más general: ¿puede Emacs crear un proceso que te permita seguir trabajando?

+0

utilice C-c C-l para ejecutar el script. –

Respuesta

19

ESS ejecuta R como proceso asincrónico. No necesitas nada de fondo. Puede ejecutar su código durante horas y seguir trabajando en ESS ininterrumpidamente.

Tu problema parece ser otra cosa. Cuando ejecuta su secuencia de comandos lo hace "visiblemente", es decir, su código ejecutado se imprime en la terminal. Esto causa que Emacs se congele.

Conjunto ess-eval-visibly a cero y enormes trozos de código se enviará al instante R:

(setq ess-eval-visibly nil) 

Saludos.

[Actualización]

Hay un nuevo escenario de ess-eval-visibply en las versiones recientes de ESS - 'nowait. Coloca el código en un búfer inferior y luego lo envía al subproceso. De esta forma, puede ver su código y toda la salida después sin esperar a que termine el subproceso.

[/ update]

+0

Si termina en un entorno de ess diferente donde no puede/no quiere evaluar y emacs lisp, puede lograr el mismo resultado asegurándose de que su función asigna su resultado a una variable. En lugar de 'long.running()' do 'res <- long.running()'. – Wilduck

+0

Pequeña actualización: A partir de la versión 12.09-1 de ESS, 'ess-eval-visible-p' ahora está en desuso. Debería usar 'ess-eval-visible'. Ver: http://ess.r-project.org/Manual/ess.html. – Vince

+0

@Vince gracias. He actualizado la respuesta. – VitoshKa

3

M-x R iniciará una sesión R (el nombre del búfer predeterminado es *R*). Si vuelve a presionar M-x R, se iniciará una segunda sesión R (con el nombre del buffer *R:2*).

Cada sesión tiene su propio proceso R, por lo que puede ejecutar un largo guión R en uno y seguir utilizando el otro de forma independiente.

Al presionar C-x C-b aparece la lista de búfer, que le permitiría cambiar entre sesiones R.

O, si se pone

(global-set-key "\C-cr" 'ess-request-a-process) 

en el archivo de inicialización .emacs, entonces cada vez que se pulsa C-c r se le pedirá para el que R sesión (buffer) que desea cambiar. Si solo tiene una sesión, cambiará allí automáticamente.

+0

Ya existe un enlace para 'ess-request-a-process' C-c C-k, pero por alguna razón peculiar y completamente desconocida, se establece de manera predeterminada en "S", incluso si configura "R" como valor predeterminado. – aL3xa

-1

En mi experiencia personal, ESS no es muy bueno en el manejo de scripts muy grandes, ya que a veces el resto de Emacs se vuelve inutilizable. Tal vez sea mejor que desarrolles en ESS, y luego ejecutes el script completo en modo BATCH.

Cuestiones relacionadas