2014-06-30 19 views
5

Dinamik bir belge için bir özet yazmaya çalışıyorum ama \Sexpr{} çağrılarım çalışmıyor.Knitr'in diğer tüm kod parçalarından sonra Sexpr değerini değerlendirmek için nasıl zorlanacağı

Esasen tüm yapmak istediğim, belgede \Sexpr{value} değerinden oluşturulan p değerleri bulunan bir özetle belgede "aşağı akış" değeri belirlenir.

\begin{document} 

<<foo>>= 
    value = 10 
@ 

Today I bought \Sexpr{value} Salamanders 

\end{document} 

Bu işe yaramazsa (ve ne başarmaya çalışıyorum)

\begin{document} 

Today I bought \Sexpr{value} Salamanders 

<<foo>>= 
    value = 10 
@ 
+0

görmektir Daha sonra hesaplamalar yapmak ve başlangıçta geri yüklemek. –

+0

Normal. İlk örneğinizde, \ Sexpr {}; Böylece iş yerinizde var ve çağrılabilir. Ve ikinci örneğinizde varolmayan değişken diyorsunuz; Bu yüzden önce onu tanımlamanız veya var olan bir çalışma alanını yüklemeniz gerekir. –

cevap

3

Peşinde \Sexpr değerlendirmesini erteleme basit bir çözüm görmüyorum: Örneğin

Bu işleri kod parçalarının değerlendirilmesi, ancak daha sonra tanımlanan değerler ile \Sexp kullanımı hala kolaydır, örneğin, bir özet: Özet için ayrı bir dosya (myabstract.Rnw) kullanın, \input{myabstract} özet özetidir sed dahil ve ana belgenin en sonuna knitmyabstract.Rnw edilecek:

document.Rnw:

\documentclass{article} 
\begin{document} 

\begin{abstract} 
    \input{myabstract} 
\end{abstract} 

Main text. 

<<>>= 
answer <- 42 
@ 

\end{document} 

<<include = FALSE>>= 
knit("myabstract.Rnw") 
@ 

myabstract.Rnw:

The answer is \Sexpr{answer}. 

Anahtar bu etmektir nasıl çalıştığını anlamak için knitr'un LaTeX'in yapacağı belgeyi işlediğini fark edin. Bu nedenle, \input{myabstract} LaTeX komutunun myabstract.tex "önce" (zamana değil, satır numarasına atıfta bulunarak) içermesi önemli değildir, knit("myabstract.Rnw")myabstract.tex'u üretir. Daha karmaşık senaryolar, değerlendirme ve çıkış için


ayrılmış olabilir: Erken parçalar halinde tüm hesaplamaları yapın ve ait oldukları sonuçlarını yazdırabilirsiniz. Kaynak kodunu göstermek için reuse parçaları (ayar eval = FALSE). bu bir hata atar mantıklı bakış sezgisel açıdan

\documentclass{article} 
\begin{document} 

<<calculation, include = FALSE>>= 
answer <- 42 
@ 

\begin{abstract} 
    The answer is \Sexpr{answer}. 
\end{abstract} 

Main text. 

<<calculation, eval = FALSE>>= 
@ 

\end{document} 
+0

Bir "\ Sexp" için mandrene önbelleğe alınan bazı "eval" komutlarını eklemenin bir yolu olabileceğini düşünmüştüm. Anladığım kadarıyla Knitr, LaTeX kodunu (birkaç kez) çalıştırmak için Latexmk'i kullanıyor mu? –

+0

Hiçbir lateksmk veya birkaç çalışma dahil edilmemiştir. Belgedeki parçalar.Rnw verilen sırayla tek tek yürütülür. Bu parçaların sonuncusu myabstract.Rnw'yi myabstract.tex'e (bunu deneyin!) Kadar örer. Örgü() 'nin çağrıldığı ortamda mevcut olan tüm nesnelerin örülmüş belgede mevcut olduğunu unutmayın. Bu nedenle, myabstract.Rnw örgü zaman 'cevap' nesnesi kullanılabilir. Tüm örgü tamamlandıktan sonra, normal TEX takım zinciri PDF'ye mydocument.tex derler. Bu noktada, myabstract.tex var ve uygun olduğunda dahil edilebilir. –

+0

Teşekkürler, bu çok yardımcı oluyor. –

1

: demek ki, Yukarıdaki örnekten Henüz bir nesnenin değeri hakkında konuşabiliriz nasıl hesaplanıyor edilecek?

Geçici bir seni şeyler kaydetmek, ancak include=FALSE sahip ve daha sonra kod yığın yeniden önce kod yığın çalıştırmak muhtemelen belgede iki geçiş çalıştırmak gerekir Chunk Reference/Macro: How to reuse chunks | knitr

\begin{document} 

%%# Code is evaluated but nothing is written in the output 
<<foo, include=FALSE>>= 
    value = 10 
    plot(sin) 
    rnorm(5) 
@ 

Today I bought \Sexpr{value} Salamanders 

%%# Here code can be included in the output (figure, echo, results etc.) 
<<bar>>= 
<<foo>> 
@ 

\end{document} 
+0

Bu gibi parçaları geri dönüştürebileceğinin farkında değildim. Cevabınız için teşekkürler. –

+0

@Eric Yığın yeniden kullanımı için daha kompakt bir sözdizimi olduğunu unutmayın, başvurulan dokümantasyon sayfasına veya yukarıdaki yanıtın ikinci bölümüne bakın. –