2014-11-18 9 views
13

Desidero impostare l'opzione "eval" del blocco in base a un elenco di nomi di blocchi. Esiste una funzione per ottenere il nome del chunk in knitr, ad es. chunk_name?Come ottenere il nome del pezzo in knitr?

Questo è il mio esempio minimo con il nome di funzione falsi "chunk_name".

--- 
output: html_document 
--- 

```{r setup} 
eval_chunks <- c('chunk1') 
``` 

```{r chunk1, eval=chunk_name() %in% eval_chunks} 
plot(cars) 
``` 


```{r chunk2, eval=chunk_name() %in% eval_chunks} 
plot(cars) 
``` 

Grazie per eventuali suggerimenti. Per favore fatemi sapere se la mia domanda non è chiara.

+1

Assumendo nomi chunk non cambiano, è possibile creare un vettore di logica chiamata 'eval_chunk <- c (chunk1 = TRUE, chunk2 = FALSE)' e poi dire '{r chunk1, eval = eval_chunk [" chunk1 "]}'. –

+0

Si potrebbe provare ad utilizzare anche gli hook. –

+1

@ RomanLuštrik Ho avuto la stessa idea, ma il problema [notato in un commento qui] (http://stackoverflow.com/questions/24687728/knitr-overwrite-chunk-options-with-hook-function#comment38286506_24687728), è le opzioni di questo blocco vengono valutate prima di chiamare gli hook, quindi non funziona. – Thomas

risposta

9

Knitr fornito etichette all'interno di un pezzo dal 2012 (bisogno di più di Google, https://github.com/yihui/knitr/issues/73).

Questo è il mio file di esempio Rmd:

--- 
output: html_document 
--- 

```{r setup} 
library(knitr) 
eval_chunks <- c('chunk1', 'chunk3') 
``` 

```{r chunk1, eval=opts_current$get("label") %in% eval_chunks} 
print(opts_current$get("label")) 
``` 


```{r chunk2, eval=opts_current$get("label") %in% eval_chunks} 
print(opts_current$get("label")) 
``` 


```{r chunk3, eval=opts_current$get("label") %in% eval_chunks} 
print(opts_current$get("label")) 
``` 
1

Penso che questa soluzione sia imperfetta perché richiede un po 'di attenzione nell'assicurarsi che i blocchi corretti siano valutati, ma aggira il problema che le opzioni di blocco vengono valutate prima di chiamare gli hook. In breve, non utilizza un hook, ma utilizza il fatto che le opzioni del blocco possono essere espressioni R. In questo caso, viene utilizzata una funzione e() che si basa su una variabile contatore globale per determinare se un particolare blocco deve essere valutato. Poiché i blocchi vengono valutati in ordine, questo funziona. Nell'esempio seguente, chunk1 e chunk3 vengono valutati, ma gli altri no.

--- 
output: html_document 
--- 

```{r setup} 
library("knitr") 
.i <- 2 # `setup` is the first chunk, so start at 2 
.x <- all_labels() %in% c("chunk1", "chunk3") 
e <- function(){ 
    d <- .x[.i] 
    .i <<- .i + 1 
    d 
} 
``` 

```{r chunk1, eval=e()} 
x <- 1 
x 
``` 

```{r chunk2, eval=e()} 
x <- 2 
x 
``` 

```{r chunk3, eval=e()} 
x <- 3 
x 
``` 

```{r chunk4, eval=e()} 
x <- 4 
x 
``` 
+1

"Poiché i blocchi vengono valutati in ordine". È il caso però? (cf 'dependson') – baptiste

+2

@baptiste Non vorrei provare questo in un documento complesso. – Thomas

+0

@Thomas Grazie per il suggerimento. Sono d'accordo con il tuo punto sul documento complesso (nel mio caso), specialmente quando aggiungi/rimuovi blocchi. – Bangyou

Problemi correlati