Sweave,R,Beamer:如何将Rnw文件中的LaTex文本转换为R注释?

7
假设我有一个.Rnw文件,其中包含通常与R代码块混合的LaTex。 (我特别想将.Rnw幻灯片文档转换为此格式,但是此问题适用于任何.Rnw文档)。现在,我想将其转换为包含所有R代码以及通常由LaTex生成的所有文本的文件,作为R注释。换句话说,我想要的功能类似于Stangle()的功能,但我还希望将LaTex的所有文本部分转换为纯文本,并在生成的.R文件中以注释形式呈现。
这将是一种非常方便的方法,可以自动生成一个带注释的R文件,在您喜欢的语法突出显示编辑器(例如emacs)中很容易查看。如果.Rnw文档实际上是幻灯片演示文稿(例如使用beamer),则此功能可能听起来并不适用于只包含少量R代码的长文章Sweave文档 - 然后幻灯片的文本部分将成为R代码的完美注释。
有人有任何关于如何做到这一点的想法吗?谢谢。
1个回答

8

这里提供一种使用正则表达式的方法。仍然存在一些问题,我将维护一个列表,并随着解决方案的出现进行更新。

# 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')

问题仍然存在:

  1. 不能很好地处理在其他块内部使用<<chunk_name>>调用的块。

你可能想要定义更复杂的正则表达式来修复块命名问题,例如:"^<<.*>>=?$" 用于开始块。但无论如何,这是非常简洁的方法...很好地使用了 mapply - aL3xa
这是一个不错的方法,很好地利用了mapply。还有一件事情可以做的更好,就是去掉所有的LaTeX标记(例如\begin{frame}\frametitle等),以产生干净、纯文本的注释——至少,去掉所有的LaTeX关键字会是一个开始。我想可以编写一个正则表达式来将LaTeX的所有保留字替换为空字符串。那是一个开始,但我希望有一种方法来利用LaTeX解析器,并以某种方式捕获LaTeX生成的文本 - Prasad Chalasani
将@Ramnath的想法与另一个SO问题中的LaTeX-to-text解决方案(https://dev59.com/8HRB5IYBdhLWcg3wvpic)相结合,可能会得到我想要的结果。 - Prasad Chalasani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接