Org Babel无法执行以表为输入的脚本

时间:2014-08-05 05:55:04

标签: emacs org-mode org-babel

我想学习Org Babel,所以我要经历Code Blocks in Org

我正在尝试在基础教程中执行该脚本,但由于某种原因无法执行此操作。

我应该将一个表作为函数的输入。这是表格:

#+name: tbl-example-data()
#+begin_src R 
runif(n=5, min=0, max=1)
#+end_src

#+RESULTS: tbl-example-data
|  0.607781215803698 | 
|  0.157157169422135 |
|  0.675619817571715 |
| 0.0488600700628012 |
|  0.998780139256269 |

下一个功能是要执行的功能:

#+name: R-mean(x)
#+begin_src R 
mean(x)
#+end_src

当我尝试通过按 C-c C-c 运行它时,我得到了

  

块“R-mean”中的变量“x”必须分配一个默认值。

我试图明确地运行R-mean(x)函数,如下所示:

#+call: R-mean(tbl-example-data)

不幸的是我得到了:

  

此缓冲区中未找到参考'R-mean'。

如何使用R-mean

中的值运行tbl-example-data函数

提前致谢。

Jenia


好的,我按照说明更改了代码:

#+NAME: tbl-example-data()
#+BEGIN_SRC R :results value  <-------------------- changed
runif(n=5, min=0, max=1)
#+END_SRC

#+RESULTS: tbl-example-data
|  0.565871287835762 |
|  0.457158328965306 |
| 0.0498181856237352 |
|  0.988381117349491 |
|  0.898329895688221 |



#+NAME: R-mean(x)
#+BEGIN_SRC R :var x=tbl-example-data <-------------- changed
mean(x)
#+END_SRC




#+call: R-mean(x=tbl-example-data)

它让我回答:

 Reference 'R-mean' not found in this buffer.

我不知道我做错了什么。

2 个答案:

答案 0 :(得分:0)

您只需进行一些小改动即可实现此功能。

  1. :results value添加到第一个代码块的标头中:

    #+NAME: tbl-example-data()
    #+BEGIN_SRC R :results value
    runif(n=5, min=0, max=1)
    #+END_SRC
    
    #+RESULTS: tbl-example-data
    ...
    
  2. :var x=tbl-example-data添加到第二个代码块的标题中:

    #+NAME: R-mean(x)
    #+BEGIN_SRC R :var x=tbl-example-data
    mean(x)
    #+END_SRC
    
  3. 通过这些更改,您描述获取最终结果的两种方式都将起作用。通过 C-c C-c 评估第二个代码块给出:

    #+RESULTS: R-mean
    : 0.49763968242332357
    

    通过R-mean调用#+CALL: R-mean(tbl-example-data)函数会产生:

    #+RESULTS:
    : 0.49763968242332357
    

    来源

答案 1 :(得分:0)

我知道这是一个非常老的问题,但是我想添加一下,以免对其他人有用。 itsjeyd的回答对我也没有完全起作用,我相信这就是原因。

需要进行三个更改。

  1. 正如其绝妙的指出,您需要在函数x中为R-mean提供默认值。您可以放:var x=tbl-example-data,但也可以放:var x=0

  2. 您需要删除对#+NAME: R-mean(x)的更改#+NAME: R-mean

  3. 当您通过x时,它被视为单列数据帧,而不是向量(至少对我而言)。因此,您可能需要将mean(x)更改为mean(x[, 1])

对我来说,无论我是否使用:results value,第一个代码块都会返回一个表。您的里程可能会有所不同。

这对我有用。

#+NAME: tbl-example-data()
#+BEGIN_SRC R
runif(n=5, min=0, max=1)
#+END_SRC

#+RESULTS: tbl-example-data
| 0.926858797203749 |
| 0.830021075671539 |
| 0.788423302117735 |
| 0.794694420881569 |
| 0.943031084956601 |


#+NAME: R-mean
#+BEGIN_SRC R :var x=""
mean(x[, 1])
#+END_SRC


#+call: R-mean(x=tbl-example-data)

#+RESULTS:
: 0.856605736166239

最后的笔记。如果第一个块名称#+NAME: tbl-example-data()的末尾带有括号,则此块似乎不会每次都重新评估。因此,多次运行call语句会产生相同的结果。

但是,如果您删除括号并给出#+NAME: tbl-example-data,则每次调用call语句时都会对块进行评估,每次都会产生不同的结果。我不知道。

希望有帮助!