2013-02-18 17 views
13

Sto cercando un modo per strutturare la mia analisi statistica. Attualmente utilizzo Emacs/ESS e il file di analisi è risultato piuttosto lungo. Ho iniziato a inserire parti del codice in funzioni intercambiabili in un file separato, ma comunque ...Strutturazione di un'analisi statistica con R utilizzando Emacs/ESS

Vorrei introdurre alcuni tipi di titoli di sottotitoli/sezioni nel file (Aggregazione, Analisi cluster, Simulazioni, ...) e scrivere il codice sottostante, così ho potuto saltare rapidamente alle sezioni su cui voglio lavorare.

Suppongo che potrei semplicemente usare i commenti e cercarli, ma non ho potuto ottenere una panoramica o un indice in questo modo. Ho anche pensato di usare Org-Mode per i titoli, ma non sarebbe molto comodo per i collaboratori, che lavorano con un altro editor.

So che R-Studio implementa questo con sezioni, quindi ci sarà una soluzione per emacs, giusto?

Grazie mille!

PS: qualcosa di simile imenu avrebbe funzionato, ma questo è solo per le funzioni, non per le sezioni

risposta

11

Le aggiunte recenti (febbraio 2013) a Orgmode indicano che ora è possibile incorporare le intestazioni di org nel codice sorgente e quindi navigare attraverso di esse utilizzando la modalità orgstruct. Quindi, aggiorna la tua modalità org via git, quindi prova ad aprire il seguente file R di esempio. Quando ti trovi su una riga di commento con un'intestazione dell'organizzazione incorporata, premi TAB o MAIUSC e otterrai le intestazioni della modalità org.

### * Create data 
data = list(s1=list(x=1:3, y=3:1), 
    s2=list(x=1:5, y=1:5), s3=list(x=1:4, y=rep(3,4))) 

### * Base graphics version 


par(mfrow=c(2,2)) 
lapply(data, plot) 

### * Lattice version 

nplots <- length(data) 
pts.per.plot <- sapply(data, function(l) length(l$x)) 
df <- data.frame(which=rep(1:nplots, times=pts.per.plot), 
       x=unlist(sapply(data, function(l) l$x)), 
       y=unlist(sapply(data, function(l) l$y))) 

xyplot(y~x|which, data=df, layout=c(2,2)) 

### ** Make the pdf 
pdf(file='o.pdf') 
xyplot(y~x|which, data=df, layout=c(2,1))     
dev.off() 

### * End of file 

### Local Variables: 
### eval: (orgstruct-mode 1) 
### orgstruct-heading-prefix-regexp: "### " 
### End: 
+0

Hm - l'ho appena provato, ma non succede nulla? Versione: Versione org 7,9.3e (7.9 .3e-1123-g33d362 @ /home/rkrug/.emacs.d/org-mode/lisp/). Dovrei chiedere alla mailing list org? – Rainer

+0

Questo funziona per me per delineare, ed è molto utile, ma i titoli non sono visualizzati con un volto particolare .Si sa se c'è un'opzione per farlo? – juba

+0

Non ho visto nulla di incorporato in orgstruct che faccia un ulteriore blocco di font, ma l'altro esempio qui con font-lock potrebbe essere adattato per evidenziare i titoli. –

15

In generale io uso org-mode e org-babele, ma quando ho avuto modo di condividere gli script con gli altri, ho 've ha ottenuto la seguente nel mio .emacs:

(defgroup ess-jb-faces nil 
    "Faces used by cutomized ess-mode" 
    :group 'faces) 

(defface ess-jb-comment-face 
    '((t (:background "cornsilk" 
    :foreground "DimGrey" 
    :inherit font-lock-comment-face))) 
    "Face used to highlight comments." 
    :group 'ess-jb-faces) 

(defface ess-jb-comment-bold-face 
    '((t (:weight bold 
    :inherit ess-jb-comment-face))) 
    "Face used to highlight bold in comments." 
    :group 'ess-jb-faces) 

(defface ess-jb-h1-face 
    '((t (:height 1.6 
    :weight bold 
    :foreground "MediumBlue" 
    :inherit ess-jb-comment-face))) 
    "Face used to highlight h1 headers." 
    :group 'ess-jb-faces) 

(defface ess-jb-h2-face 
    '((t (:height 1.2 
    :weight bold 
    :foreground "DarkViolet" 
    :inherit ess-jb-comment-face))) 
    "Face used to highlight h2 headers." 
    :group 'ess-jb-faces) 

(defface ess-jb-h3-face 
    '((t (:height 1.0 
    :weight bold 
    :foreground "DarkViolet" 
    :inherit ess-jb-comment-face))) 
    "Face used to highlight h3 headers." 
    :group 'ess-jb-faces) 

(defface ess-jb-hide-face 
    '((t (:foreground "white" 
    :background "white" 
    :inherit ess-jb-comment-face))) 
    "Face used to hide characters." 
    :group 'ess-jb-faces) 

(font-lock-add-keywords 'ess-mode 
    '(("^###\\(#\\)\\([^#].*\\)$" (1 'ess-jb-hide-face t)(2 'ess-jb-h1-face t)) 
    ("^###\\(##\\)\\([^#].*\\)$" (1 'ess-jb-hide-face t)(2 'ess-jb-h2-face t)) 
    ("^###\\(###\\)\\([^#].*\\)$" (1 'ess-jb-hide-face t)(2 'ess-jb-h3-face t)) 
    ("^###\\(.*\\|$\\)" 1 'ess-jb-comment-face t) 
    ("^###" "\\*.*?\\*" nil nil (0 'ess-jb-comment-bold-face append)) 
    )) 

con questo, ogni commento con #### all'inizio della riga è formattata come un 'colpo di testa 1'. Qualsiasi commento con ##### è formattato come "intestazione 2", ecc. E le righe che iniziano con ### vengono considerate come commenti con un carattere speciale di blocco (utilizzato per i commenti lunghi).

Questo può dare qualcosa di simile:

enter image description here

questo è abbastanza hacky, ma il vantaggio è che si utilizza solo commenti standard R e come tale può essere condiviso senza problemi con gli altri. In generale mi utilizzare il seguente per "intestazione 1": altri lo vedono come qui di seguito, mentre mi piace il mio definito font-lock:

############################################ 
#### HEADER 1 
############################################ 

Con questa sintassi, è anche possibile utilizzare il seguente per attivare outline-minor-mode sulle sezioni definito in precedenza ed essere in grado di piegare/loro svolgersi:

(add-hook 'ess-mode-hook 
     '(lambda() 
     (auto-complete-mode nil) 
     (outline-minor-mode 1) 
     (setq outline-regexp "\\(^#\\{4,6\\}\\)\\|\\(^[a-zA-Z0-9_\.]+ ?<- ?function(.*{\\)") 
     (setq outline-heading-alist 
      '(("####" . 1) ("#####" . 2) ("######" . 3) 
      ("^[a-zA-Z0-9_\.]+ ?<- ?function(.*{" .4))))) 

Tutto questo codice non è stato molto ben collaudato, e io sono lontano da un esperto in Emacs Lisp, quindi non ci dovrebbero essere modi migliori per farlo, e non essere sorpreso in caso di bug!

+0

Mi ci è voluto un po 'per provare il tuo suggerimento. Ma di recente ho fatto e il blocco dei caratteri sta funzionando. Ma io uso un tema scuro ('zenburn') per emacs, e ora i titoli bloccati sui font hanno uno sfondo bianco, che è un po 'duro per gli occhi. Guardando il tuo screenshot sembra che tu abbia risolto questo problema in qualche modo. –

+0

Sono riuscito a cambiare lo sfondo della nascondiglio con il colore che corrisponde al mio tema. Ora voglio modificare le parole chiave da #### a ### *, da ##### a ### ** e da ###### a ### ***, in modo da poter utilizzare orgstruct- modalità facilmente. Qualche aiuto con le espressioni regolari? Ho provato qualcosa seguendo queste linee: '(("^ ### \\ (* \\) \\ ([^ #]. * \\) $" (1' ess-jb-hide-face t) (2 'ess-jb-h1-face t)) –

+0

@ stats-hb Forse qualcosa del genere? (Non testato): '"^### \\ (\\ * \\) \\ ([^ *]. * \\) $ "' – juba

8

Sembra che tu abbia un grande script di analisi. Non è molto ottimale ...

Pensa a rifarlo con RMarkdown o Sweave e utilizza knitr per eseguirlo. Quindi puoi usare gli strumenti di emacs per navigare tra markdown o TeX e puoi usare il sistema di caching in knitr per salvare le analisi necessarie fin dall'inizio quando hai cambiato qualcosa verso la fine.

È anche possibile ottenere un rapporto formattato dall'analisi, se lo si desidera.

Inoltre, suddividere le informazioni in file separati per l'approvvigionamento è un po 'non ottimale, molto meglio scrivere funzioni e inserirle in un pacchetto, e utilizzare il pacchetto devtools per semplificare il lavoro con esso. Basta modificare i tuoi file .R e lo load_all lo aggiorna (nessuno dei complessi pacchetti di cose del passato).

Big winnage.

+0

Un problema con l'utilizzo di Rmarkdown è che non è (ancora) realmente supportato in Emacs/ESS. –

3

polymode fornisce R + Markdown, R + birra, R + cpp e altre cose. È ancora in una fase iniziale di sviluppo e sembra funzionare in modo affidabile solo su emacs molto recenti (24.3).

0

Un'altra opzione, di cui sono stato felice nel corso degli anni, è la modalità allout. Utilizzo delle variabili locali per file:

## Local variables: 
## allout-layout: (-1 : 0) 
## End: 
1

Analogamente alla orgstruct modalità di cui sopra è anche possibile utilizzare la nuova outshine package, che collabora con outline-minor-mode per interpretare commenti con l'asterisco come intestazioni org-mode-like . Possono essere piegati/espansi/aggiunti/etc usando scorciatoie come TAB, ecc.