实际上如何开始使用Sweave

3

我的问题可能比标题所示的更具体。我在Mac OS X上运行R,使用MySQL数据库存储数据。我已经使用Komodo / Sciviews-R工作了一段时间。最近我需要自动生成报告,并研究了Sweave。我想StatET / Eclipse似乎是Sweavers的“标准”解决方案。

1)从Komodo切换到StatET Eclipse是否合理?我之前试过StatET,但因为我太喜欢Komodo中的调用提示/自动建议和更方便的配置而选择了Komodo。

2)生成Sweave文件的合理工作流程是什么?通常我先开发我的R代码,然后再关注报告。今天我才知道,在Sweave中有一个文件同时包含R代码和Latex代码,并且从这个文件创建.tex文档。虽然示例文件看起来很方便,但我真的无法想象如何将我的250多行R代码输入到一个文件中,并与Latex混合。

是否可以将qplot()和ggplot()语句直接输入到此类文档中,并以某种方式源化功能,例如数据库连接和中间结果?

还是只是习惯于Latex和R代码的混合?

感谢任何建议、提示、链接和回归本质的呼声...


2
如果你意识到你的问题可能比标题所暗示的更为特定,那么这不就意味着你应该想出一个更好的标题吗? - Seamus
任何关于标题的帮助都将不胜感激 :) 基本上,我不想将两个相关的问题(与SO一般或甚至R标签有关)分开发布。另一方面,如何总结软件和工作流程问题? - Matt Bannert
我对Sweave或R的了解不足,无法建议更好的标题。 - Seamus
3个回答

8
您提出了几个问题,以下是相应的回答:
StatEt/Eclipse是进行Sweave的正确方法吗?
不一定(注意:我是StatEt/Eclipse的忠实用户,用于纯R、Sweave/R,非常喜欢它,我没有使用过Komodo/sciviews-R)。您应该能够从任何R命令行运行sweave命令,这将生成一个.tex文件。然后,您可以从任何tex环境将.tex文件转换为可读取的内容(如pdf)。
什么是良好的Sweave工作流程?
当我想要将一个r脚本转换为sweave报告时,通常会从空的sweave模板开始,并将整个R脚本复制/粘贴到标题后面的sweave R块中,即:
<<label=myEntireRScript, echo=false, include=false>> 
#Insert code here
myTable<-dataframe(...)
myPlot<-qplot(....)
@ 

然后我会浏览并找到想要报告的部分。例如,如果我想将一个表格放入报告中,我会剪切R块并换成xtable块,对于变量和图形也是一样。

<<label=myEntireRScript, echo=false, include=false>>=  
#Insert code here
@ 
Put any text I want before my table here, maybe with a \Sexpr{print(variable)} named variable

<<label=myTable, result=Tex>>= 
myTable<-dataframe(...)
print(xtable(mytable,...),...)
@ 
Any text I want before my figure
<label=myplot, result=figure>>= 
myPlot<-qplot(....)
print(qplot)
@ 

7
您可能想查看这些 相关的 SO 帖子。我的其余帖子与您的第二个问题有关。
在使用Sweave创建报告时,我通常将大部分R代码和报告文本分开。如果R代码运行速度很快,那么我更喜欢在.Rnw文件的开头包含以下内容:
<<>>
source('/path/to/script.r')
@

另一方面,如果R代码执行时间很长,我通常会在R脚本末尾添加以下内容:

Sweave('/path/to/report.Rnw'); system('pdflatex report.tex')

这样,我就可以快速重新生成报告,而无需再次运行所有R代码。然后,在Sweave文件中,R需要做的唯一工作就是打印表格,制作图形,可能提取一些图像。


+1 :)。第一个建议听起来合理,即使没有尝试也是如此。不太明白第二个建议,但希望在尝试后能够理解。可能也是因为我目前只手动调用.tex渲染(使用texshop)。 - Matt Bannert

6

像 nullglob 一样,我更喜欢将 R 和 Sweave 文件分开,但我更喜欢使用 save.image() 而不是 source() 文件来保存工作区。这样可以避免在每个 .Rnw 文件编译时运行 R 计算(我总是对排版进行调整,而不是想要的那样)。

我的一般工作流程是在自己的文件夹中使用自己的 R 文件进行每个论文/项目。当计算部分“完成”时,我使用 save.image() 将所有工作区变量存储为原样。

然后,在同一目录中的 .Rnw 文件中,我使用 setwd() 设置工作目录,并使用 load(".Rdata") 加载所有变量。当然,您可以更改用于工作区的名称,但我每个文件夹使用一个工作区并保留默认名称。哦,如果您修改了 R 文件,请确保保存工作区图像,并注意在工作区和 .Rnw 文件中存在但不再是 R 文件的一部分的变量... 这就是 save.image() 方法可能会引起一些麻烦的地方。

我使用 Mac,如果您有点小技术,我建议使用 TextMate,如果您真的很懂,那么使用 emacs/ess。我使用 vim 和命令行 R,但大多数情况下 emacs/ess 对于大多数人来说效果最好。如果您想长期从事此项工作,我相信您学习 emacs/ess 用于 R、Sweave 和 LaTeX 是不会后悔的。


是的,这是一个长期的问题。我测试了Komodo/sciviews-R、Eclipse/StatET甚至ESS。到目前为止,我没有转向ESS,因为我有一些与我的奇特(瑞士)键盘无关的问题,我不想浪费时间。现在,我很满意Komodo,但不确定备受赞誉的Eclipse/StatET组合是否有助于舒适的Sweave工作流程... - Matt Bannert
好的。无论您选择哪种编辑器或IDE,我建议使用save.image()load(".Rdata"),而不是source()。我发现这在编辑阶段可以节省很多时间。尝试使用一个只需要10秒钟运行的R文件进行两种方式的尝试,您很快就会看到优势。 - Richard Herron
看看 cacheSweave 包 - 它缓存运行计算的结果,然后跳过代码块,如果它们的内容没有被更新。 - Sharpie
cacheSweave非常酷,提供了save.image()的节省时间的好处,但我几乎确定它需要将所有计算嵌入到.Rnw文件中。你可以用一个只引用R文件的代码块完成吗? - Richard Herron

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