2015-10-13 84 views
11

基於一些簡單的測試,interactive()rmarkdown::render()knitr::knit2html()內運行代碼時爲true。也就是說,含如何判斷代碼是否在knitr/rmarkdown環境中執行?

```{r} 
print(interactive()) 
``` 

給出報告TRUE一個HTML文件的簡單.rmd文件。

有沒有人知道我可以在代碼塊中運行一個測試,它將確定它是否正在「非交互式」運行,我的意思是「在knit2html()或render()內」嗎?

回答

13

Yihui suggested on githubisTRUE(getOption('knitr.in.progress'))可用於檢測代碼是否正被針織的或交互執行。

2

我懷疑(?)你可能只需要推出自己的。

如果是這樣,這裏有一種方法似乎表現得很好。它通過提取調用堆棧中所有函數的名稱來工作,然後檢查它們中的任何一個是否被命名爲"knit2html""render"。 (根據你需要的強度有多強,你可以做一些額外的檢查,以確保這些功能在和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()) 
``` 
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")) 
``` 
相關問題