2011-11-09 12 views
7

Dire che ho un file .Rnw contenente il solito LaTex mescolato con pezzi di codice R. (Sono particolarmente interessato alla conversione di un documento di diapositive .Rnw, ma questa domanda si applica a qualsiasi documento .Rnw). Ora voglio convertirlo in un file che contiene tutto il codice R, più tutto il testo che verrebbe normalmente generato da LaTex, come R commenti. In altre parole, la funzionalità che desidero è simile a ciò che fa Stangle(), ma voglio anche che tutta la parte di testo del LaTex venga convertita in testo normale e commentata nel file .R risultante.Sweave, R, Beamer: come convertire il testo LaTex in un file Rnw in commenti R?

Questo sarebbe un modo molto conveniente per generare automaticamente un file R commentato che è facile da guardare nel tuo editor di evidenziazione della sintassi preferito (ad es. Emacs). Questo potrebbe non sembrare una grande idea per un documento di Sweave che è un lungo articolo con solo un po 'di codice R, ma inizia a sembrare allettante quando il documento .Rnw è in realtà una presentazione (ad esempio usando beamer) - quindi la parte di testo delle diapositive renderebbe i commenti perfetti per il codice R.

Qualcuno ha qualche idea su come farlo? Grazie in anticipo.

risposta

8

Ecco un approccio utilizzando regex. Ci sono ancora alcuni problemi che rimangono, e manterrò una lista che sarà aggiornata con le risoluzioni.

# READ LINES FROM RNW FILE 
lines <- readLines('http://users.stat.umn.edu/~charlie/Sweave/foo.Rnw') 

# DETECT CODE LINES USING SWEAVE CHUNK DEFINITIONS 
start_chunk <- grep("^<<.*=$", lines) 
end_chunk <- grep("^@" , lines) 
r_lines  <- unlist(mapply(seq, start_chunk + 1, end_chunk - 1)) 

# COMMENT OUT NON CODE LINES AND WRITE TO FILE 
lines[-r_lines] <- paste("##", lines[-r_lines]) 
writeLines(lines, con='codefile.R') 

questioni in sospeso:

  1. non tratta bene con blocchi chiamati all'interno di altri blocchi utilizzando <<chunk_name>>
+0

Si consiglia di definire le espressioni regolari più complesse per riparare il pezzo denominazione problema, come: '"^<<.*>> =? $ "' Per il blocco iniziale. Ma è un approccio molto pulito, comunque ... un buon uso di 'mapply'. – aL3xa

+0

Questo è un approccio pulito, e sì, un buon uso di 'mapply'. Un'altra cosa che sarebbe bella è sbarazzarsi di tutti i markup 'LaTeX' (cose come' \ begin {frame} ',' \ frametitle', ...) per produrre commenti puliti, puramente testuali - Almeno, sbarazzarsi di tutte le parole chiave di LaTeX sarebbe un inizio. Suppongo che si possa scrivere una regex per sostituire tutte le parole riservate di LaTeX con stringhe vuote. Sarebbe un inizio, ma spero che ci sia un modo per sfruttare il parser LaTeX e in qualche modo catturare il * testo * che il lattice avrebbe generato. –

+0

Combinare l'idea di @ Ramnath con una delle soluzioni LaTeX-to-text da un'altra domanda SO (http://stackoverflow.com/questions/530121/how-do-i-convert-latex-to-plain-text-ascii) potrebbe prendermi quello che voglio –

Problemi correlati