2014-06-30 8 views
5

Próbuję napisać streszczenie dla dokumentu dynamicznego, ale moje połączenia \Sexpr{} nie działają.Jak zmusić Knitr do oceny Sexpr po wszystkich innych fragmentach kodu

Zasadniczo wszystko, co próbuję zrobić, to rozpoczynać dokument od abstrakcji, która ma p-wartości wygenerowane z \Sexpr{value}, gdzie wartość jest określona "w dół" w dokumencie. Na przykład

to działa:

\begin{document} 

<<foo>>= 
    value = 10 
@ 

Today I bought \Sexpr{value} Salamanders 

\end{document} 

To nie działa (i to, co próbuję osiągnąć)

\begin{document} 

Today I bought \Sexpr{value} Salamanders 

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

prawdopodobnie będziesz musiał uruchomić dwie przełęcze w dokumencie, zapisz rzeczy cię z późniejszych obliczeń i wczytaj go z powrotem na początku. –

+0

To normalne. W pierwszym przykładzie zdefiniowałeś "wartość" przed wywołaniem w \ Sexpr {}; więc istnieje w twojej przestrzeni roboczej i można ją nazwać. W drugim przykładzie nazywacie nieistniejącą zmienną; więc musisz go najpierw zdefiniować lub załadować przestrzeń roboczą tam, gdzie ona istnieje. –

Odpowiedz

3

nie widzę prostą rozwiązanie do odroczenia oceny \Sexpr po ocena fragmentów kodu, ale nadal jest łatwe w użyciu \Sexp z wartościami zdefiniowanymi dalej, na przykład w streszczeniu: użyj osobnego pliku (myabstract.Rnw) do streszczenia, dodaj \input{myabstract}, gdzie streszczenie jest suppo sed być włączone i knitmyabstract.Rnw na samym końcu głównej dokumentu:

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}. 

kluczem do zrozumienia, jak działa to jest sobie sprawę, że knitr przetwarza dokument przed LaTeX. Dlatego nie ma znaczenia, że ​​komenda LaTeX \input{myabstract} zawiera myabstract.tex "przed" (nie odnosząc się do czasu, ale odnosząc się do numeru wiersza), knit("myabstract.Rnw") generuje myabstract.tex.


Dla bardziej złożonych scenariuszy, oceny i wyjścia mogą być rozdzielone: ​​Czy wszystkie obliczenia na początku kawałki i wydrukować wyniki, do której należą. Aby wyświetlić kod źródłowy, reuse porcje (ustawienie eval = FALSE). Korzystając z przykładu z góry, to znaczy:

\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

Wyobrażałem sobie, że może istnieć jakiś sposób dodania polecenia 'eval', które buforowało uchwyt dla' \ Sexp' wyżej. Jeśli rozumiem to poprawnie, Knitr wykorzystuje Latexmk do uruchomienia kodu LaTeX (kilka razy)? –

+0

Żaden latexmk ani kilka odcinków nie są zaangażowane. Kawałki w dokumencie.Rnw są wykonywane jeden po drugim w podanej kolejności. Ostatni z tych kawałków dzianiny myabstract.Rnw to myabstract.tex (spróbuj!). Zwróć uwagę, że wszystkie obiekty dostępne w środowisku, w którym wywoływane jest knit(), są dostępne w dokumencie, który jest dziany. Dlatego obiekt 'odpowiedź' jest dostępny podczas dziania myabstract.Rnw. Po zakończeniu robótki zwykły toolchain TEX kompiluje mydocument.tex do pliku PDF. W tym momencie plik myabstract.tex istnieje i może być dołączony w razie potrzeby. –

+0

Dzięki, jest to bardzo pomocne. –

1

z intuicyjnego punktu widzenia ma sens, że to zgłasza błąd: Jak można mówić o wartości obiektu, który ma być dopiero obliczany?

Możliwym rozwiązaniem jest przed uruchomieniem kawałek kodu, ale mają include=FALSE a następnie ponownie wykorzystać fragment kodu później zobaczyć 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

Nie wiedziałem, że możesz tak szybko przetwarzać fragmenty. Dzięki za twoją odpowiedź. –

+0

@Eric Zauważ, że istnieje bardziej kompaktowa składnia ponownego użycia fragmentów, zobacz stronę dokumentacji, do której odnosi się odwołanie lub drugą część mojej odpowiedzi powyżej. –

Powiązane problemy