2013-09-07 31 views
6

To jest bardzo prosta prośba, i nie mogę uwierzyć, że jeszcze nie znalazłem rozwiązania, ale szukałem jej daleko i bez powodzenia.ESS & Knitr/Sweave: Jak pobrać plik Rnw do interaktywnej sesji?

Mam plik .Rnw załadowany w Emacs, używam M-n s, aby go skompilować. Wszystko działa dobrze, a nawet otwiera bufor R. Wspaniały. Ale ten bufor jest całkowicie bezużyteczny: nie zawiera obiektów, które właśnie pozyskałem!

Przykład minimalne .Rnw plików

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

Stosując M-n s, że mają nowy R buforze o sesji załadowany, ale:

> foo 
Error: object 'foo' not found 

To rozczarowujące. Chciałbym interaktywnie korzystać z danych. Jak to osiągnąć? Nie chcę dostarczać plików wiersz po wierszu lub region-region za pomocą C-c C-c lub czegoś podobnego za każdym razem, gdy zmieniam kod. Idealnie powinno być tak, jak funkcja źródłowa RStudio, która pozostawia mi w pełni przygotowaną sesję R.

Nie próbowałem tego jeszcze ze swetrem, tylko z dzianiną.

EDYCJA: opcja porcji eval=TRUE nie wydaje się powodować prawidłowego zachowania.

Odpowiedz

6

To zachowanie zostało ostatnio zmienione w ESS. Teraz sweave i knitr są wykonywane bezpośrednio w środowisku globalnym, tak jakbyś sam pisał je w linii poleceń. Poczekaj kilka tygodni, aż ESSv13.09 się skończy lub skorzystaj z wersji rozwojowej.

Alternatywnie można również ustawić ess-swv-processing-command na "% s (% s)", a otrzymasz taki sam wynik, z wyjątkiem automatycznego ładowania biblioteki.

Dla zapisu, knitr (w przeciwieństwie do swingu) ocenia wszystko we własnym środowisku, chyba że instruujesz inaczej.

[edytuj: Coś poszło nie tak. Nie widzę już prawidłowego .ess_weave. Prawdopodobnie jeszcze raz zepsuło się polecenie git. Więc nie jest ustalony w 13.09. Napraw to teraz. Przepraszam.]

+0

w szczególności, 'knitr' domyślnie ocenia kod w' parent.frame() ', chyba że' knit (..., envir = globalenv()) '(czasami' parent.frame() 'jest po prostu' globalenv() ', a czasami nie jest) –

+0

Miło słyszeć, że to naprawiłeś. Dzięki! Zgodnie z komentarzem @ Yihui, jakiś czas temu naprawiłem to, edytując '.ess_weave()' w '" $ EMACS_HOME/site-lisp/ess/etc/ESSR.R "', aby użyć 'envir = parent .frame (2) '(jak w' command (file, envir = parent.frame (2)) '), zamiast domyślnego' knit() 'envir = parent.frame()'. (Jestem teraz ** użytkownikiem ** knitr **, więc nie jestem pewien, jak ta edycja będzie grała z Sweave.) –

+0

Dziękuję za odpowiedź! Ustawienie 'ess-swv-processing-command' nie rozwiązało problemu, ale teraz szukam możliwości użycia' envir = globalenv() '. Nie sądzę, żebym chciał przełączyć się na wersję rozwojową, ale będę oglądał ESS w górę strumienia jak jastrząb :-) –

6

Otwórz interaktywną sesję R, a następnie zadzwoń bezpośrednio do Sweave, tak sądzę (nie testowany). knitr działa w ten sam sposób, chociaż najpierw trzeba wczytać bibliotekę knitr.

> Sweave("yourfile.Rnw") 

Istnieje tu jednak pewien potencjał niebezpieczeństwa. Jeśli wywołasz Sweave w sesji po wykonaniu innych czynności, twój kod może używać rzeczy wcześniej w obszarze roboczym, co sprawia, że ​​twoje wyniki nie są odtwarzalne.

+0

To trochę kundel, ale przynajmniej działa. Prawidłowym sposobem na zrobienie tego wydaje się być knitr :: knit ("file.Rnw"). Ze względu na powtarzalność należy najpierw użyć 'rm (list = ls())', aby stare obiekty nie przeszkadzały. Więc domyślam się, że moja jedyna opcja polega na związaniu tego z jakimś skrótem ... –

+0

Rozumiem, nie zdawałem sobie sprawy, że szukasz klucza ESS do tego. Cieszę się, że znalazłeś inną odpowiedź, która działa dla ciebie. – Aaron