Ale*_*alm 5 r knitr r-markdown
快速,可能是愚蠢的问题:在R markdown/knitr文档中,是否可以在实际调用函数后将函数定义放在doc的末尾(例如在附录中)?
CL.*_*CL. 12
在实际调用函数之后,是否可以在文档末尾放置函数定义?
从技术上讲,没有.在调用函数之前需要定义函数.但是,问题涉及到knitr它应该改写:
在实际调用函数之后,是否可以在文档末尾显示函数定义?
是的,有几种方法可以实现这一目标.请注意,选项2和3可以在打印突出显示的函数源代码中找到.
在使用之前定义函数.
```{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}
```
Run Code Online (Sandbox Code Playgroud)
与另一个非空块具有相同标签的空块"继承"后者的代码.这在如何重用块中描述.块中的代码definition在first(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
```
Run Code Online (Sandbox Code Playgroud)
Yihui的网站上描述了这个选项.它使用该函数insert_fun生成包含函数定义的块.
insert_fun = function(name) {
read_chunk(lines = capture.output(dump(name, '')), labels = paste(name, 'source', sep = '-'))
}
Run Code Online (Sandbox Code Playgroud)
这种方法非常灵活,因为无论函数是在单独的块中还是在sourced 文件中定义都无关紧要.
insert_fun获取函数的名称(as 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}
```
Run Code Online (Sandbox Code Playgroud)