快速,可能是愚蠢的问题:在R markdown / knitr文档中,是否可以在实际调用函数后将函数定义放在doc的末尾(例如在附录中)?
答案 0 :(得分:11)
在实际调用函数后,是否可以在文档末尾放置函数定义?
从技术上讲,没有。在调用函数之前,函数需要定义。但是,由于问题与knitr
有关,因此应该改写:
在实际调用函数后,是否可以在文档末尾显示函数定义?
是的,有几种方法可以实现这一目标。请注意,选项2和3可以在Print highlighted source code of a function中找到。
在使用之前定义函数。
```{r definition, echo = FALSE}
myfun <- function(x) {
return(sprintf("You passed me %s", x))
}
```
Use the function:
```{r}
myfun(123)
```
Show the chunk where it was defined:
```{r definition, eval = FALSE}
```
与另一个非空块具有相同标签的空块“继承”后者的代码。这在How to reuse chunks中有所描述。
第一个(definition
)隐藏了块echo = FALSE
内的代码。稍后,当要打印代码时,请使用eval = FALSE
以避免再次评估代码。
当在单独的块中定义函数时,此选项很方便。
print
这是最简单的选项,但输出不会有语法高亮显示。只需在隐藏的块中定义函数,使用它并稍后打印函数定义:
Define the function *before* it is used.
```{r definition, echo = FALSE}
myfun <- function(x) {
return(sprintf("You passed me %s", x))
}
```
Use the function:
```{r}
myfun(123)
```
```{r}
myfun
```
Yihui's website描述了此选项。它使用函数insert_fun
生成包含函数定义的块。
insert_fun = function(name) {
read_chunk(lines = capture.output(dump(name, '')), labels = paste(name, 'source', sep = '-'))
}
这种方法非常灵活,因为无论函数是在单独的块中还是在source
d的文件中定义都无关紧要。
insert_fun
获取函数的名称(作为character
)并创建一个标记为functionname-source
的块:
Define the function *before* it is used.
```{r definition, echo = FALSE}
# Define your function.
myfun <- function(x) {
return(sprintf("You passed me %s", x))
}
library(knitr)
# Define insert_fun.
insert_fun = function(name) {
read_chunk(lines = capture.output(dump(name, '')), labels = paste(name, 'source', sep = '-'))
}
insert_fun("myfun") # creates a chunk labelled "myfun-source"
```
Use the function:
```{r}
myfun(123)
```
```{r myfun-source, eval = FALSE}
```