我想学习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.
我不知道我做错了什么。
答案 0 :(得分:0)
您只需进行一些小改动即可实现此功能。
将:results value
添加到第一个代码块的标头中:
#+NAME: tbl-example-data()
#+BEGIN_SRC R :results value
runif(n=5, min=0, max=1)
#+END_SRC
#+RESULTS: tbl-example-data
...
将:var x=tbl-example-data
添加到第二个代码块的标题中:
#+NAME: R-mean(x)
#+BEGIN_SRC R :var x=tbl-example-data
mean(x)
#+END_SRC
通过这些更改,您描述获取最终结果的两种方式都将起作用。通过 C-c C-c 评估第二个代码块给出:
#+RESULTS: R-mean
: 0.49763968242332357
通过R-mean
调用#+CALL: R-mean(tbl-example-data)
函数会产生:
#+RESULTS:
: 0.49763968242332357
答案 1 :(得分:0)
我知道这是一个非常老的问题,但是我想添加一下,以免对其他人有用。 itsjeyd的回答对我也没有完全起作用,我相信这就是原因。
需要进行三个更改。
正如其绝妙的指出,您需要在函数x
中为R-mean
提供默认值。您可以放:var x=tbl-example-data
,但也可以放:var x=0
。
您需要删除对#+NAME: R-mean(x)
的更改#+NAME: R-mean
。
当您通过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语句时都会对块进行评估,每次都会产生不同的结果。我不知道。
希望有帮助!