2016-01-04 7 views
5

Önceki R sonucuna dayanarak çıktı dosyasında (.html, .pdf, ...) bazı parça parçalarını dinamik olarak yazabilen bir .rmd dosyası geliştirmeyi düşünüyorum. Aşağıda Basit koymak için bunun işe yaradığını istiyorum: sıradan metin ve kod parçaları:Her parçadaki R kodu sonuçlarına dayalı olarak örgü metni dinamik olarak çıktı verebilir mi?

knitr bir belgeyi işler
```{r,echo=F,include=FALSE} 
x=1; 

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

##if x=2 then output text below 
text2 

..... 
+4

\ cat cat (c ('text1,' text2 ') [x]) \ '? – arvi1000

+1

Sorunuzun cevabı “evet”, yapılabilir, birçok yol. –

+0

@BryanHanson Teşekkürler Bryan, bir iki örnek vererek biraz ışık tutabiliyor musunuz? oldukça memnun olarak. – xappppp

cevap

0

yukarıdaki cevabı tüm iyi ve iyi, ama karmaşık. Yorumda önerildiği gibi satır içi kodu kullanın.

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

Düzenleme: Bu yana yanıt seçildi. Ben detaylandırırım. if() veya ifelse() veya switch() işlevlerini kullanabilirsiniz. En hızlı, daha hızlı ve daha temiz kodları değiştirmeyi seviyorum. Ancak, anahtardaki başka bir ifadenin nasıl kullanılacağından emin değilim.

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

Soru * koşullu * çıktı hakkındaydı. Yani satır içi ifadeye en azından bir "if (koşul)" eklemeniz gerekiyor. Ayrıca, cevabımın oldukça ayrıntılı olabileceğini de unutmayın, ancak alt satır son örnekte gösterildiği kadar basittir (asis, echo = ...} 'ile yığın). –

4

, belge girişinin iki kategoriye ayrılır. Normal metin değişmeden kalır ve çıktı dosyasına iletilir. Sonuç olarak, düz metnin dinamik olarak dahil edilmesi gerekiyorsa,'un içinde bir yığın olması gerekir. .

Kod parçaları options'a göre değerlendirilir. Geçerli senaryoda, en önemli seçenekler:

  • eval
  • echo
  • results
  • engine

eval bir öbek değerlendirilir olmadığını belirler; eval = FALSE yığınları atlar. echo, yığının kaynak kodunun görüntülenip görüntülenmeyeceğini belirler. results, bir parçanın çıktısının nasıl işlendiğini belirler. Varsayılan olarak (results = "markup) çıktıya belge türüne özgü işaretleme uygulamak için bir çıkış kancası kullanılır. results = "asis", tüm çıktıların herhangi bir değişiklik yapılmadan "olduğu gibi" çıktı dosyasına eklendiği anlamına gelir. Bu üç seçenekleri ile

, şu başarılı olabilir:

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.") 
``` 

Çıktı:

This is some text ... 



... that is dynamically generated. 

Not ilk yığın çünkü eval = FALSE değerlendirilir olmadığını. Bununla birlikte, bir R yığınından gelen çok sayıda metin cat() hantaldır. Bunu aşmak için engine kullanılabilir. R'nin yanı sıra, (şu anda belgesiz?) Motor asis arasında bulunan parçaları değerlendirmek için kullanılabilecek other engines vardır. Bu motor çok basit. knitr NEWS file Gönderen:

onu işlemeden öbek içerik yazmaya asis adlı yeni motor eklendi; echo ve eval yığın seçeneklerine de saygı duyar - her ikisi de FALSE olduğunda, yığın gizlenir; Bu mümkün dil motorları için (source)

R Markdown kod yığın başlıklarının sözdizimi artık ```{lang, option=value}` olabilir şartlı

aşağıdaki sözdizimsel şeker ile asis motoru birleştiren metni yazmak için yapar (örYukarıdan ```{r, engine='lang', option=value}

örnek eşdeğerdir ```{python} ve ```{Rcpp}) dönüşür:

This is some text ... 

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

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

Teşekkürler @CL. cevabın için. Bununla birlikte, çözümünüz bu kod yığınındaki diğer her şeyi aynı metin biçiminde ve varsayılan kod çıktısı gibi yazdıramaz. Çözümümü ekleyeceğim. – ah25

+0

@Asieh Evet, bu kasıtlı. Bu sorunun sizinkilerden biraz farklı bir odak noktası var. İlgilendiğinizde sadece bağlantı kurdum. –

+0

Koşullu olarak görüntülenecek kısa metin parçaları için, [bu yanıt] (http://stackoverflow.com/a/25407811/2706569) çok kullanışlı bir çözüm sağlar. –

0

Aşağıdakiler, üstbilgiyi basacak ve bu üstbilgiden sonra (x) koşulunu ayarlayan bir değişkene dayanarak kod yığınını yürütecektir.

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

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

Bunu (varolan cevabınıza) kendi sorunuzda eklemelisiniz; Bence buraya ait değil. –

İlgili konular