如何判断代码是否在 knitr/rmarkdown 上下文中执行?
how to tell if code is executed within a knitr/rmarkdown context?
根据一些简单的测试,当 运行ning 代码在 rmarkdown::render()
或 knitr::knit2html()
中时,interactive()
为真。也就是说,一个简单的 .rmd
文件包含
```{r}
print(interactive())
```
给出一个 HTML 文件报告 TRUE
。
有谁知道我可以在代码块中 运行 进行测试,以确定它是否 运行 "non-interactively",我的意思是 "within knit2html() or render()"?
我怀疑 (?) 您可能只需要自己动手。
如果是这样,这里有一种方法似乎效果很好。它的工作原理是提取调用堆栈中所有函数的名称,然后检查它们中的任何一个是否命名为 "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())
```
关于自己滚动的简单建议:看看您是否可以访问当前输出格式:
```{r, echo = FALSE}
is_inside_knitr = function() {
!is.null(knitr::opts_knit$get("out.format"))
}
```
```{r}
is_inside_knitr()
```
当然,您可以检查很多事情 -- 这不是这些功能的预期用途,因此它可能不是最可靠的解决方案。
因为 Yihui suggested on github isTRUE(getOption('knitr.in.progress'))
可用于检测代码是否正在编织或交互执行。
根据一些简单的测试,当 运行ning 代码在 rmarkdown::render()
或 knitr::knit2html()
中时,interactive()
为真。也就是说,一个简单的 .rmd
文件包含
```{r}
print(interactive())
```
给出一个 HTML 文件报告 TRUE
。
有谁知道我可以在代码块中 运行 进行测试,以确定它是否 运行 "non-interactively",我的意思是 "within knit2html() or render()"?
我怀疑 (?) 您可能只需要自己动手。
如果是这样,这里有一种方法似乎效果很好。它的工作原理是提取调用堆栈中所有函数的名称,然后检查它们中的任何一个是否命名为 "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())
```
关于自己滚动的简单建议:看看您是否可以访问当前输出格式:
```{r, echo = FALSE}
is_inside_knitr = function() {
!is.null(knitr::opts_knit$get("out.format"))
}
```
```{r}
is_inside_knitr()
```
当然,您可以检查很多事情 -- 这不是这些功能的预期用途,因此它可能不是最可靠的解决方案。
因为 Yihui suggested on github isTRUE(getOption('knitr.in.progress'))
可用于检测代码是否正在编织或交互执行。