基于一些简单的测试,在interactive()
或rmarkdown::render()
内运行代码时knitr::knit2html()
为真。也就是说,一个包含
.rmd
文件
```{r}
print(interactive())
```
提供报告TRUE
。
有没有人知道我可以在代码块中运行的测试,该代码块将确定它是否正在运行"非交互式",我的意思是"在knit2html()或渲染中( )"
答案 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())
```