2015-10-09 13 views
6

Używam RStudio i knitr na drutach .Rmd do .docxOcenić inline kodu R w rmarkdown figury podpisie

chciałbym zawierać kod inline na rysunku napisami np coś jak poniżej w opcjach fragmentach:

fig.cap = „Wykres nrow(data) punktów danych”

Jednak knitr nie ocenia tego kodu, zamiast po prostu drukowania polecenia unevaluated.

Czy istnieje sposób, aby uzyskać knitr do oceny kodu r w podpisach tabeli/rysunku?

+0

Proszę wypróbować 'wklej (" Wykres ", nrow (dane)," punkty danych ")'. –

Odpowiedz

8

knitr ocenia opcje porcji jako kod R. Dlatego, aby zawierać wartość zmiennej w podpisie rysunku, tylko komponować żądany ciąg używając paste lub sprintf:

fig.cap = paste("Graph of", nrow(data), "data points") 

Należy pamiętać, że może to być problematyczne, jeśli data jest tworzony wewnątrz tego kawałka (a nie w poprzednim kawałku), ponieważ domyślnie opcje porcji są oceniane przed sam fragment jest oceniany.

Aby rozwiązać ten problem, należy wybrać opcję pakietu eval.after mieć możliwość fig.cap być oceniana po sam kawałek został oceniony:

library(knitr) 
opts_knit$set(eval.after = "fig.cap") 

Oto kompletny przykład:

--- 
title: "SO" 
output: 
    word_document: 
    fig_caption: yes 
--- 


```{r fig.cap = paste("Graph of", nrow(iris), "data points.")} 
plot(iris) 
``` 


```{r setup} 
library(knitr) 
opts_knit$set(eval.after = "fig.cap") 
``` 

```{r fig.cap = paste("Graph of", nrow(data2), "data points.")} 
data2 <- data.frame(1:10) 
plot(data2) 
``` 

Pierwszy podpis figurki działa nawet bez eval.after, ponieważ zbiór danych iris jest zawsze dostępny (o ile dołączono datasets). Generowanie drugiego podpisu na figurze zakończyłoby się niepowodzeniem bez eval.after, ponieważ data2 nie istnieje przed oceną ostatniego fragmentu.