2013-09-07 3 views
6

Das ist eine furchtbar einfache Anfrage, und ich kann nicht glauben, dass ich die Lösung noch nicht gefunden habe, aber ich habe ohne Glück weit und breit danach gesucht.ESS & Knitr/Sweave: Wie kann man die RNW-Datei in eine interaktive Sitzung einbinden?

Ich habe eine .Rnw Datei in Emacs geladen, ich verwende M-n s, um es zu kompilieren. Alles funktioniert gut, und es öffnet sogar einen R Puffer. Groß. Aber dieser Puffer ist völlig nutzlos: Er enthält nicht die Objekte, die ich gerade bezogen habe!

Beispiel minimal .Rnw Datei:

\documentclass{article} 
\begin{document} 
<<>>= 
    foo <- "bar" 
@ 
\end{document} 

Mit M-n s, ich habe jetzt einen neuen R-Puffer mit einer Sitzung geladen, aber:

> foo 
Error: object 'foo' not found 

Das ist enttäuschend. Ich möchte interaktiv mit den Daten spielen. Wie erreiche ich das? Ich möchte nicht die Datei Zeile für Zeile oder Region-by-Region mit C-c C-c oder etwas ähnliches, jedes Mal, wenn ich meinen Code ändern. Idealerweise sollte es genau wie RStudios Quellfunktion sein, die mich mit eine vollständig vorbereitete R-Sitzung lässt.

Ich habe dies noch nicht mit Sweave ausprobiert, nur mit Knitr.

EDIT: die eval=TRUE Chunk-Option scheint nicht zu dem richtigen Verhalten führen.

Antwort

6

Dieses Verhalten wurde kürzlich in ESS geändert. Jetzt werden Sweave und Knitr direkt in der globalen Umgebung ausgeführt, so als ob Sie es selbst an der Befehlszeile schreiben würden. Warten Sie also noch ein paar Wochen bis ESSv13.09 oder nutzen Sie die Entwicklungsversion.

Alternativ können Sie auch ess-swv-processing-command auf "% s (% s)" setzen, und Sie erhalten das gleiche Ergebnis, mit Ausnahme des automatischen Ladens der Bibliothek.

Für die Aufzeichnung, Knitr (im Gegensatz zu Sweave) wertet alles in seiner eigenen Umgebung aus, es sei denn Sie anders anweisen.

[Bearbeiten: Etwas ging schief. Ich sehe die richtige .ess_weave nicht mehr. Wahrscheinlich begnügen sich einige git wieder mit Fehlern. So ist es nicht in 13.09 behoben. Fixiere es jetzt. Entschuldigung.]

+0

spezifisch, 'knitr' wertet den Code in' parent.frame() 'standardmäßig aus, es sei denn, Sie stricken (..., envir = globlenv())' (manchmal 'parent.frame() 'ist nur' globlenv() ', und manchmal ist es nicht –

+0

Schön zu hören, dass Sie das behoben haben. Vielen Dank! In Anlehnung an @ Yihuis Kommentar hatte ich dies vor einiger Zeit selbst behoben, indem ich '.ess_weave()' in '" $ EMACS_HOME/site-lisp/ess/etc/ESSR.R "' '' envir = parent editierte .frame (2) '(wie in' command (file, envir = parent.frame (2)) '), anstatt der' strick() '' s default 'envir = parent.frame()'. (Ich bin nur ein ** knitr ** Benutzer in diesen Tagen, also bin ich mir nicht sicher, wie dieser Schnitt mit Sweave spielt.) –

+0

Vielen Dank für Ihre Antwort! Die Einstellung 'esss-swv-processing-command' hat mir nicht geholfen, aber ich untersuche gerade 'envir = globalenv()'. Ich denke nicht, dass ich zur Entwicklungsversion wechseln möchte, aber ich werde Upstream ESS wie ein Falke beobachten :-) –

6

Öffnen Sie eine interaktive R-Sitzung, und dann Swave direkt aufrufen, glaube ich so (ungetestet obwohl). knitr funktioniert auf die gleiche Weise, obwohl Sie die Knitr-Bibliothek zuerst laden müssen.

> Sweave("yourfile.Rnw") 

Hier besteht jedoch ein gewisses Gefahrenpotential. Wenn Sie Swave in einer Sitzung aufrufen, nachdem Sie andere Dinge ausgeführt haben, kann Ihr Code zuvor im Arbeitsbereich verwendete Objekte verwenden, sodass Ihre Ergebnisse nicht mehr reproduziert werden können.

+0

Das ist ein bisschen wie ein Klotz, aber zumindest funktioniert es. Die korrekte Knitrichtung scheint knitr :: knit ("file.Rnw") zu sein. Aus Gründen der Reproduzierbarkeit sollte man wahrscheinlich zuerst 'rm (list = ls())' 'verwenden, damit alte Objekte nicht stören. Also denke ich, meine einzige Option ist, das irgendwie an irgendeine Abkürzung zu binden ... –

+0

Ich sehe, habe nicht gemerkt, dass du nach einer ESS-Schlüsselbindung dafür suchst. Freut mich zu hören, dass Sie eine andere Antwort gefunden haben, die für Sie funktioniert. – Aaron