我想使用切换按钮来etoolbox
指示 Sweave 评估或不评估代码块。示例:
\newtoggle{FirstTime}
\toggletrue{FirstTime}
%\togglefalse{FirstTime}
\iftoggle{FirstTime}{
<<>
read.csv("My Big Fat Data file.csv") -> MyData
@
}
这个想法是在工作会话开始时读取数据,这样\togglefalse
就不需要再次读取了。我使用的是 Eclipse 和 StatET,因此对象 MyData 将驻留在内存中,并在整个会话期间可供 R 访问。
但是,无论切换值如何,上述代码都会进行评估。
我知道我可以通过改变eval=TRUE
来实现这个结果eval=FALSE
- 但使用切换会更清晰并提供更多的灵活性。
答案1
我鼓励你尝试一下knitr
包裹,它可以更优雅地完成这项工作。请参阅手册中的第 3.5 节“块选项的评估”:https://github.com/downloads/yihui/knitr/knitr-manual.pdf
您的方法有两个问题:
- Sweave 不会识别
\iftoggle
,因为它不分析 TeX 上下文;tex 文档纯粹作为字符串处理——每当它看到时<<>>=
,它都会将以下行视为 R 代码,无论您是否有\iftoggle
上述代码块; \iftoggle{FirstTime}{}
你可以通过插入代码块来编写更多代码,并且这如何用较少的努力来实现这一点knitr
:\documentclass{article} \begin{document} <<controller>>= # this variable controls if a chunk should be evaluated dothis <- TRUE @ <<chunk1, eval = dothis>>= print('say hello world') @ <<chunk2, eval = !dothis>>= print('silence is gold') @ \end{document}
如果你觉得语法很奇怪,你可以阅读knitr
与 Sweave有何不同;基本上knitr
使您的文档真正具有可编程性。