如何判断代码是否在knitr / rmarkdown上下文中执行?

时间:2015-10-13 16:27:40

标签: r knitr r-markdown

基于一些简单的测试,在interactive()rmarkdown::render()内运行代码时knitr::knit2html()为真。也就是说,一个包含

的简单.rmd文件
```{r}
print(interactive())
```

提供报告TRUE

的HTML文件

有没有人知道我可以在代码块中运行的测试,该代码块将确定它是否正在运行"非交互式",我的意思是"在knit2html()或渲染中( )"

3 个答案:

答案 0 :(得分:21)

由于Yihui suggested on github isTRUE(getOption('knitr.in.progress'))可用于检测代码是否正在编织或以交互方式执行。

答案 1 :(得分:3)

更简单的推荐自己的建议:看看你是否可以访问当前的块选项。

```{r, echo = FALSE}
inside_knitr = function() {
    length(knitr::opts_current$get()) > 0
}
```

```{r}
inside_knitr()
```

当然,你可以检查很多东西。我喜欢当前块选项的想法,另一种可能性如下。我不确定两者的利弊。

```{r}
!is.null(knitr::opts_knit$get("out.format"))
```

答案 2 :(得分:2)

我怀疑(?)你可能只需要自己动手。

如果是这样,这里的一种方法似乎表现得很好。它的工作原理是提取调用堆栈中所有函数的名称,然后检查它们中的任何一个是否被命名为"knit2html""render"。 (根据您需要的强大程度,您可以进行一些额外的检查,以确保这些功能确实是 knitr rmarkdown 包中的功能,但一般想法仍然是一样的。)

```{r, echo=FALSE}
isNonInteractive <- function() {
    ff <- sapply(sys.calls(), function(f) as.character(f[[1]]))
    any(ff %in% c("knit2html", "render"))
}
```

```{r}
print(isNonInteractive())
```