6

这是一个非常简单的请求,我不敢相信我还没有找到解决方案,但我一直在寻找它,但没有运气。

.Rnw在 Emacs 中加载了一个文件,我用M-n s它来编译它。一切正常,它甚至打开了一个R缓冲区。伟大的。但是那个缓冲区完全没用:它不包含我刚刚采购的对象!

最小.Rnw文件示例:

\documentclass{article}
\begin{document}
<<>>=
  foo <- "bar"
@
\end{document}

使用M-n s,我现在有一个加载了会话的新 R 缓冲区,但是:

> foo
Error: object 'foo' not found 

这是令人失望的。我想以交互方式处理数据。我该如何做到这一点?C-c C-c每次更改代码时,我都不想逐行或逐个区域地获取文件或类似的东西。理想情况下,它应该就像 RStudio 的源函数一样,让我有一个充分准备好的 R 会话。

我还没有用 sweave 试过这个,只有 knitr。

编辑:eval=TRUE块选项似乎不会导致正确的行为。

4

2 回答 2

6

打开一个交互式 R 会话,然后直接调用 Sweave,我相信是这样的(虽然未经测试)。 knitr以相同的方式工作,但您需要先加载 knitr 库。

> Sweave("yourfile.Rnw")

不过,这里有一些潜在的危险。如果您在执行其他操作后在会话中调用 Sweave,您的代码可以使用工作区中以前的内容,从而使您的结果无法重现。

于 2013-09-07T12:47:50.473 回答
6

这种行为最近在 ESS 中发生了变化。现在 sweave 和 knitr 直接在全局环境中执行,就好像你在命令行自己写一样。所以再等几个星期,直到 ESSv13.09 出来或使用开发版本。

或者,您也可以设置ess-swv-processing-command为“%s(%s)”,您将获得相同的结果,除了自动库加载。

作为记录,knitr(与 sweave 相比)会评估其自身环境中的所有内容,除非您另有指示。

[编辑:出了点问题。我再也看不到正确的 .ess_weave 了。可能又是一些 git commit 搞砸了。所以它在 13.09 中没有修复。现在修复它。对不起。]

于 2013-09-07T15:03:03.513 回答