2013-03-26 7 views
12

In this answer @hyihui sagte, dass knitr die globale Umgebung verwendet. Das verwirrte mich - meine Erfahrung war, dass es nicht so ist. Ich benutze nie wirklich knit obwohl ich normalerweise direkt zum PDF gehe.Kann knit2pdf die globale Umgebung nutzen?

In einem kleinen Experiment scheint es, dass knit die globale Umwelt tut (oder was auch immer Umgebung Sie envir Argument angeben verwenden), aber die knit2pdf nicht.

Minimal Beispiel: global_test.Rnw Datei

\documentclass{article} 
\begin{document} 
<<>>= 
    print(x) 
@ 
\end{document} 

R Script:

x <- "Hello World" 
knit(input="global_test.Rnw") 
# Works as expected, could now call tools::texi2pdf to generate pdf. 

knit2pdf(input="global_test.Rnw") 
# Doesn't 

Letzteres erzeugt PDF-Datei, die nicht angezeigt wird und gibt eine Warnung aus:

running command '"C:\PROGRA~2\MIKTEX~1.9\miktex\bin\texi2dvi.exe" --quiet --pdf 
"global.pdf" -I "C:/PROGRA~1/R/R-215~1.3/share/texmf/tex/latex" -I 
"C:/PROGRA~1/R/R-215~1.3/share/texmf/bibtex/bst"' had status 1 

Ich habe versucht, eine Umgebung an knit2pdf (envir = globalenv()) übergeben, in der Hoffnung, es würde b e ... weitergegeben, ich bekomme nur einen unbenutzten argument error.

Im Allgemeinen Ich weiß, dass die globale Umwelt Referenzierung schlechte Form ist, aber gibt es eine Möglichkeit, es mit knit2pdf zu tun, oder eine Umgebung, ausdrücklich zu passieren, oder bin ich besser mit brew und sprintf wie in @Ramnath's answer zum gleichen Frage oben?

In meinem Anwendungsfall glaube ich nicht tools::texi2pdf ist nützlich, weil ich mit XeLaTeX kompilieren muss, die mühelos knit2pdf behandelt.

+0

Haben Sie versucht, explizit den 'envir' Parameter in' strick2pdf' zu setzen? – krlmlr

+0

Ja, ich bekomme nur einen unbenutzten Argumentfehler. – Gregor

+0

Haben Sie es versucht, ohne eine globale Variable zu referenzieren? Ich bekomme genau den gleichen Fehler, wenn ich 'strick2pdf()' benutze, wenn die eine Zeile von R-Code 'print (" Hello World ")' ist (dh wenn es keinen expliziten Verweis auf eine globale Variable gibt) ... I bin auf einer Windows XP-Box mit R-devel und 'knitr_1.1', mit einer MikTeX-Distribution unter der Haube. –

Antwort

7

Die Probleme mit den Beispielen in der Frage scheinen nichts mit Umgebungen zu tun zu haben. Alles wird korrekt und ohne Warnungen kompiliert, wenn das output Argument von knit2pdf weggelassen wird.

Als Referenz wurde mit I 1.1 auf R 2.15.3 auf Windows 7. knitr Ich werde Yihui wissen lassen, wie es um einen Fehler in knit2pdf zu sein scheint (die tools::texi2pdf aufruft, die kein Ausgabedateipfad akzeptiert).

UPDATE: Das Problem wurde in der Entwicklungsversion von knitr, available here behoben.

Es ist auch erwähnenswert, dass die Compile PDF Taste in RStudionicht Ihre aktuelle Umgebung verwenden, so dass, wenn Sie den Zugriff auf globale Variablen haben wollen, und Sie verwenden RStudio, machen einen expliziten Aufruf an die entsprechende knit Funktion anstatt sich auf die Verknüpfung zu verlassen. In der Tat verwendet es nicht knit2pdf direkt, sondern ruft rmarkdown::render.

+0

Vielen Dank für die Meldung des Problems! Die wahre Geschichte ist, "knitr" 1.1 hat nicht das "envir" Argument; die Entwicklungsversion von 'knitr' fügte sie hinzu, entfernte aber später das Argument 'output'. Jetzt hat die neueste Entwicklungsversion beide Argumente und 'knit2pdf()' sollte jetzt gut funktionieren. –

+1

@Yihui Danke! Und danke für das wundervolle Paket! – Gregor

+0

Ich benutze Rstudio mit R Markdown. Gilt das auch für Abschriften? Ich verwende Source(), um ein Skript in einem zwischengespeicherten Chunk auszuführen. Ich möchte die in diesem Skript berechneten Objekte in späteren Blöcken verwenden, diese Objekte scheinen jedoch für spätere Blöcke nicht verfügbar zu sein. Kannst du erklären, was ich tun muss? –

Verwandte Themen