在R knitr中调用后放置函数定义

时间:2015-09-21 06:47:50

标签: r knitr r-markdown

快速,可能是愚蠢的问题:在R markdown / knitr文档中,是否可以在实际调用函数后将函数定义放在doc的末尾(例如在附录中)?

1 个答案:

答案 0 :(得分:11)

  

在实际调用函数后,是否可以在文档末尾放置函数定义?

从技术上讲,没有。在调用函数之前,函数需要定义。但是,由于问题与knitr有关,因此应该改写:

  

在实际调用函数后,是否可以在文档末尾显示函数定义?

是的,有几种方法可以实现这一目标。请注意,选项2和3可以在Print highlighted source code of a function中找到。

选项1:重用块

在使用之前定义函数

```{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以避免再次评估代码。

当在单独的块中定义函数时,此选项很方便。

选项2:简单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
```

选项3:生成包含函数定义

的块

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}
```