使用R的org-babel代码没有输出结果

8

Org 8.2.10 Emacs 24.5.1 OSX 10.10.3

#+BEGIN_SRC R    
1 + 2
#+END_SRC

#+RESULTS:
: 3

但是,与之相伴的是


#+BEGIN_SRC R
  x <- rnorm(100)
  summary(x)
#+END_SRC

#+RESULTS:

"代码块未产生任何输出",而 *Messages* 缓冲区包含:

Error reading results: (beginning-of-buffer)
Code block produced no output.

我不确定为什么第二个例子没有输出。在我的机器上,R安装运行良好。

如果有任何帮助,我将非常感激。

1个回答

17

:results output添加到头部行,例如:

#+BEGIN_SRC R :results output
  x <- rnorm(100)
  summary(x)
#+END_SRC

#+RESULTS:
:     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
: -2.63500 -0.42370  0.02539  0.04136  0.48370  1.92000 

Org 提供了两种不同的方式来捕获代码块的结果:

以下选项是互斥的,它们指定应该如何从代码块中收集结果。

  • value 这是默认值。结果是代码块中最后一个语句的值。此标题参数将评估放在函数模式下。请注意,在某些语言中(例如 Python),使用此结果类型需要在源代码块的主体中包含 return 语句。例如::results value

  • output 结果是在代码块执行期间输出到 STDOUT 的所有内容。此标题参数将评估放在脚本模式下。例如::results output

由于您的第一个块返回常规值,因此可以在 :results 中不指定任何内容,并使用默认设置 value

您的第二个块返回必须显式打印的值:

默认方法返回一个类为 c("summaryDefault", "table") 的对象,该对象具有专门的 print 方法。

使用具有专用 print 方法返回值的 R 代码必须在 Org 中进行特殊处理(强调是我的):

如果源代码块使用基于网格的 R 图形,例如 lattice 和 ggplot2 包,则必须小心地打印() 图形对象,指定 :results output,或在 :session 中运行代码。这是因为来自 lattice 和 ggplot2 的图形函数返回必须显式打印才能看到它们的对象,使用 print 函数。当交互式运行时(例如,:session),会自动执行此操作,但在另一个函数内部调用时不会。定义操作方式 :results value 的方式是将设备和 ggplot2 函数调用包装在 main 函数中,除非明确打印对象,否则不会产生任何输出。

正如提到的那样,显式调用 print 并在 :session 中运行代码是其他可能的解决方案。


1
作为一个非Emacs用户(但是相当熟练的R用户),我不清楚你为什么认为第二个代码段不应该产生任何值。带有数值向量参数的summary函数返回一个类为“summaryDefault”的结构体。 - IRTFM
@BondedDust,你似乎是正确的。我在R方面经验不多,但在Emacs方面经验很丰富,所以我的原始答案受到了这方面的影响。我进行了一些研究并更新了我的答案;希望这能澄清事情。 - Chris
呵呵,“出现”?只是出现了吗?在发布之前,我确实查看了页面,但更重要的是,我执行了dput(summary(x)) - IRTFM
@BondedDust,我并不是心存怨恨。在我不是专家的领域,我倾向于避免下结论。明确一下:根据您评论的内容和促使我审查的文档,您是正确的 :-)。 - Chris
请记住“输出”和“值”的区别。如果我没记错的话,Org-mode源代码块默认将值输出到相应的结果容器中。从我相对有限的对R的理解来看,R REPL打印所有执行操作的输出。我相信这就是为什么在Org-mode源代码块中,除非明确设置“result”类型,否则summary无法按照预期的方式生成所需的输出,因为summary本身并不是一个“print”函数。 - Jonathan Jin

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