2016-01-04 14 views
5

Sto pensando di sviluppare un file .rmd in grado di scrivere dinamicamente alcuni blocchi di narrazione nel file di output (.html, .pdf, ...) basato sul risultato R precedente. Per dirla semplice sotto è come lo voglio funziona:Can knitr può produrre dinamicamente un testo narrativo basato su codice R in ogni blocco?

```{r,echo=F,include=FALSE} 
x=1; 

``` 
##if x=1 then output text below 
text1 

##if x=2 then output text below 
text2 

..... 
+4

\ 'r cat (c ('testo1,' testo2 ') [x]) \'? – arvi1000

+1

La risposta alla tua domanda è sì, può essere fatta in molti modi. –

+0

@BryanHanson Grazie Bryan, ti dispiace fare un po 'di luce dando uno o due esempi? molto apprezzato. – xappppp

risposta

0

La risposta di cui sopra è tutto buono e bene, ma complicato. Utilizza il codice inline, come suggerito nel commento.

The mean of x is `r mean(x)` which is very high... 

Edit: Dal momento che questa è stata scelta come la risposta. Elaborerò. È possibile utilizzare if() o ifelse() o switch(). Mi piace cambiare il codice più veloce, più pulito e più pulito. Tuttavia non sono sicuro di come usare un'altra istruzione nell'interruttore.

```{r} 
x <- 1 
``` 
x is `r if(x==1){"equal to one"} else {"not equal to one"}` which is great... 

x is `r ifelse(x==1, "equal to one", ifelse(x==2, "equal to two", "not equal to one or two"))` which is great... 

x is `r switch(x, "1" = "equal to one", "2" = "equal to two")` which is great... 
+0

La domanda riguardava l'output * condizionale *. Quindi è necessario aggiungere almeno un 'if (condition)' all'espressione in linea. Nota anche che la mia risposta potrebbe essere abbastanza dettagliata, ma la linea di fondo è semplice come mostrato nell'ultimo esempio (pezzo con 'asis, echo = ...}'). –

4

Quando knitr elabora un documento, il documento è diviso in due categorie di ingresso: testo e codici ordinari pezzi. Il testo ordinario rimane invariato e viene passato al file di output. Di conseguenza, se il testo normale deve essere incluso dinamicamente, deve essere all'interno di un blocco.

I blocchi di codice vengono valutati in base al loro options. Nello scenario attuale, per la maggior parte le opzioni importanti sono:

  • eval
  • echo
  • results
  • engine

eval determina se un pezzo viene valutata; eval = FALSE salta il blocco. echo determina se visualizzare il codice sorgente del blocco. results determina come viene trattato l'output di un blocco. Per impostazione predefinita (results = "markup) viene utilizzato un hook di output per applicare il markup specifico del tipo di documento all'output. results = "asis" significa che tutto l'output è incluso nel file di output "così com'è", senza alcuna modifica.

Con queste tre opzioni, di seguito potrebbe essere realizzato:

This is some text ... 

```{r, echo = FALSE, eval = FALSE, results = "asis"} 
cat("... with a secret inside ...") 
``` 

```{r, echo = FALSE, eval = TRUE, results = "asis"} 
cat("... that is dynamically generated.") 
``` 

uscita:

This is some text ... 



... that is dynamically generated. 

Si noti che il primo pezzo non è valutato a causa eval = FALSE.

Tuttavia, è ingombrante a cat() un sacco di testo da un chunk R. engine può essere utilizzato per superare questo. Oltre a R, ci sono other engines che possono essere utilizzati per valutare i blocchi, tra cui il motore (attualmente non documentato?) asis. Questo motore è molto semplice. Da knitr NEWS file:

aggiunto un nuovo motore denominato asis per scrivere il contenuto del blocco senza elaborarlo; rispetta anche le opzioni del blocco echo e eval - quando uno dei due è FALSE, il blocco verrà nascosto; ciò rende possibile scrivere testo condizionale

Combinando il motore asis con il seguente zucchero sintattico (source)

per motori di lingua, la sintassi di R codice Markdown header chunk può essere ```{lang, option=value}` ora (ad esempio```{python} e ```{Rcpp}), che equivale a ```{r, engine='lang', option=value}

l'esempio precedente diventa:

This is some text ... 

```{asis, echo = FALSE} 
... with a secret inside ... 
``` 

```{asis, echo = TRUE} 
... that is dynamically generated. 
``` 
+0

Grazie @CL. per la tua risposta. Tuttavia, la soluzione stamperà qualsiasi altra cosa in quel blocco di codice nello stesso formato di testo e non come l'output di codice predefinito. Aggiungerò la mia soluzione. – ah25

+0

@Asieh Sì, questo è intenzionale. Questa domanda ha un focus leggermente diverso dal tuo. L'ho collegato solo nel caso fossi interessato. –

+0

Per brevi frammenti di testo che devono essere visualizzati in modo condizionale, [questa risposta] (http://stackoverflow.com/a/25407811/2706569) fornisce una soluzione molto utile. –

0

Quanto segue stampa l'intestazione ed eseguire il codice blocco dopo che un'intestazione basata su una variabile che imposta la condizione (x).

```{r,} 
x<- FALSE 
Title <- ifelse(x, "My header","") 
``` 

## `r Title` 
```{r, echo=FALSE} 
if(x) {print(1:5)} 
``` 
+0

Faresti meglio ad aggiungere questo (alla tua risposta esistente) nella tua stessa domanda; Non penso che appartenga qui. –

Problemi correlati