2013-09-07 11 views
6

これはひどく簡単な要求ですが、私はこれについての解決策をまだ見つけられていないとは思えませんが、私はそれを幸運なことなく遠くまで探し続けてきました。ESS&Knitr/Sweave:Rnwファイルをインタラクティブなセッションにする方法は?

私は.RnwファイルをEmacsに読み込んでいますが、私はM-n sを使ってコンパイルしています。 すべて正常に動作し、さらにRバッファを開きます。すばらしいです。しかし、そのバッファー はまったく役に立たない:それは私がソースしたオブジェクトを含んでいない!

例最小限.Rnwファイル:

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

M-n sを使用するには、私が今までロードされたセッションで新しいR-バッファを持っていますが、:

> foo 
Error: object 'foo' not found 

がっかりされます。私は対話的にデータを使いたいと思っています。 これはどのように実現するのですか?私はコードを変更するたびに、ファイルを1行ずつ、または 地域別にC-c C-cなどのようにソースしたくありません。 理想的には、これはRstudioのソース関数と同じで、完全に準備されたRセッション が残っています。

私はまだこの菓子を使っていませんでしたが、これはknitrだけでした。

EDIT:eval=TRUEチャンクオプションが正しく動作していないようです。

答えて

6

この動作は最近ESSで変更されました。今やsweaveとknitrは、コマンドラインで自分で書くときと同じように、グローバル環境で直接実行されます。 ESSv13.09が終了するまで数週間待つか、開発版を使用してください。

また、ess-swv-processing-commandを "%s(%s)"に設定することもできますが、ライブラリの自動読み込みを除いて同じ結果が得られます。

knitr(sweaveとは対照的に)は、指示がない限り、自分の環境内のすべてを評価します。

[編集:何かが間違っていました。私はもう正しい.ess_weaveが表示されません。おそらくいくつかのgitコミットアップを再度コミットします。したがって、13.09では修正されていません。今すぐ修正する。申し訳ありません。]

+0

特に、 'knitr'は' knit(...、envir = globalenv()) '(時には' parent ')を除いて 'parent.frame()'のコードをデフォルトで評価します。frame() 'は単に' globalenv() 'であり、時にはそうではありません) –

+0

これを修正したと聞いてうれしいです。ありがとう! @ Yihuiのコメントに沿って、私は '$ EMACS_HOME/site-lisp/ess/etc/ESSR.R" 'の' .ess_weave() 'を編集して' envir = parent 'knit()'のデフォルトの 'envir = parent.frame()'ではなく、.frame(2) '(' command(file、envir = parent.frame(2)) 'のように) (私は最近** knitr **ユーザなので、Sweaveでその編集方法が分からないのです。) –

+0

ありがとうございました! 'ess-swv-processing-command'を設定しても、私のためのトリックはありませんでしたが、私は' envir = globalenv() 'を使っています。私は開発版に切り替えるつもりはないと思っていますが、上流のESSを鷹のように見ます:-) –

6

インタラクティブなRセッションを開き、Sweaveを直接呼び出すと、これは(テストされていないにもかかわらず)好きだと思います。 knitrも同じ方法で動作しますが、最初にknitrライブラリをロードする必要があります。

> Sweave("yourfile.Rnw") 

ここでも危険性があります。他の作業を行った後にセッションでSweaveを呼び出すと、コードは以前にワークスペース内のものを使用することができ、結果を再現不可能にします。

+0

これはちょっとしたものですが、少なくとも動作します。 knitr :: knit( "file.Rnw")と思われる正しいknitr方法です。再現性のために、古いオブジェクトが干渉しないように 'rm(list = ls())'を最初に使うべきでしょう。だから私は私の唯一の選択肢は何とかこれをいくつかのショートカットにバインドすることだと思う... –

+0

私は、あなたがこれのためのESSのキーバインディングを探していたとは思わなかった。喜んであなたのために働く別の答えを見つけました。 – Aaron

関連する問題