2015-10-13 8 views
11

Sulla base di alcuni semplici test, interactive() è true quando si esegue il codice all'interno di rmarkdown::render() o knitr::knit2html(). Cioè, un semplice file contenente .rmdcome dire se il codice viene eseguito all'interno di un contesto knitr/rmarkdown?

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

dà un file HTML che segnala TRUE.

Qualcuno sa di un test che posso eseguire all'interno di un blocco di codice che determinerà se viene eseguito "non interattivo", con cui intendo "all'interno di knit2html() o render()"?

risposta

13

Come Yihui suggested on githubisTRUE(getOption('knitr.in.progress')) può essere utilizzato per rilevare se il codice è in maglia o eseguito in modo interattivo.

2

Sospetto (?) Che potrebbe essere necessario eseguire il rollover.

Se è così, ecco un approccio che sembra funzionare bene. Funziona estraendo i nomi di tutte le funzioni nello stack di chiamate e quindi controlla se qualcuno di loro è denominato "knit2html" o "render". (A seconda di come robusto è necessario che questo sia, si potrebbe fare un po 'di una verifica supplementare per assicurarsi che queste sono davvero le funzioni nel knitr e rmarkdown pacchetti, ma l'idea generale sarebbe ancora lo stesso.)

```{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

Un suggerimento più semplice per il rollover: vedere se è possibile accedere alle opzioni del blocco corrente.

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

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

Ci sono, ovviamente, molte cose che è possibile controllare. Mi piace l'idea delle attuali opzioni di blocco, un'altra possibilità è qui sotto. Non sono davvero sicuro dei pro/contro di entrambi.

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