2010-05-05 6 views
25

Eseguo spesso lunghi script R quando avvio il mio ambiente R. Mi piacerebbe essere in grado di caricare/eseguire lo script R in Emacs/ESS e continuare altri lavori in un altro buffer.Come è possibile eseguire lo sfondo del processo R in ESS/Emacs?

Quando si preme C-g o C-c C-c, il processo viene interrotto e devo riavviare lo script.

Qual è il modo migliore per eseguire lo sfondo del processo R in ESS/Emacs?

MODIFICA: Grazie per le risposte e i commenti, ma nessuno di loro si riferisce al fatto che Emacs si blocca quando si carica/esegue uno script di grandi dimensioni e non è possibile modificare il buffer.

Suppongo che la mia domanda sia un po 'più generale: Emacs può fare una procedura per continuare a funzionare?

+0

uso C-c C-l per eseguire lo script. –

risposta

19

ESS esegue R come processo asincrono. Non è necessario fare nulla sullo sfondo. È possibile eseguire il codice per ore e continuare a funzionare in ESS senza interruzioni.

Il tuo problema sembra essere qualcos'altro. Quando esegui il tuo script lo fai "visibilmente", cioè il codice eseguito viene stampato sul terminale. Questo causa il blocco di Emacs.

Set ess-eval-visibly a zero e enormi pezzi di codice verrà inviato a R istantaneamente:

(setq ess-eval-visibly nil) 

Cin cin.

[update]

C'è una nuova impostazione per ess-eval-visibply nelle versioni recenti di ESS - 'nowait. Mette il codice in un buffer inferiore e quindi lo invia al sottoprocesso. In questo modo puoi vedere il tuo codice e tutto l'output in seguito senza attendere il completamento del sottoprocesso.

[/ aggiornamento]

+0

Se ci si trova in un ambiente diverso dove non è possibile/non si desidera valutare ed emacs lisp, è possibile ottenere lo stesso risultato assicurandosi che la funzione stia assegnando il risultato a una variabile. Invece di 'long.running()' do 'res <- long.running()'. – Wilduck

+0

Piccolo aggiornamento: A partire dalla versione ESS 12.09-1, 'ess-eval-visibly-p' è ora deprecato. Dovrebbe usare 'ess-eval-visibly'. Vedi: http://ess.r-project.org/Manual/ess.html. – Vince

+0

@Vince grazie. Ho aggiornato la risposta. – VitoshKa

3

M-x R avvia una sessione R (il nome del buffer predefinito è *R*). Se si preme di nuovo il M-x R, verrà avviata una seconda sessione R (con nome del buffer *R:2*).

Ogni sessione ha il proprio processo R, quindi è possibile eseguire uno script R lungo in uno e utilizzare ancora l'altro in modo indipendente.

Premendo C-x C-b si visualizza l'elenco di buffer, che consente di passare da una sessione all'altra.

Oppure, se si mette

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

nel file di inizializzazione .emacs, poi ogni volta che si preme C-c r verrà richiesto per il quale sessione di R (buffer) che si desidera passare. Se hai solo una sessione, passerà automaticamente lì.

+0

C'è già un binding per C-k C -k di 'ess-request-a-process', ma per qualche strano e completamente sconosciuto motivo è impostato su "S", anche se si imposta "R" come predefinito. – aL3xa

-1

Nella mia esperienza personale, ESS non è molto bravo a gestire script di grandi dimensioni, in quanto a volte il resto di Emacs diventa inutilizzabile. Forse è meglio fare lo sviluppo in ESS, quindi eseguire lo script completo in modalità BATCH.

Problemi correlati