2016-12-10 6 views
4

私はRStudioでRmarkdownを使用しており、新しいグラフィックスウィンドウで開いたプロットも含めています。ウィンドウがコードチャンク内で直接開かれている場合は、というプロットは、処理された文書に含まれるです。しかし、ウインドウがソースとなる別のスクリプトで開かれている場合、プロットはKnitrの処理中に表示されますが、ではなく、がドキュメントに含まれています。ここで実証する.Rmdスクリプトの完全な最小限の例です。ソーススクリプトで開いたウィンドウからのプロットをRmarkdownに含めるにはどうすればよいですか?

--- 
title: "Rmarkdown graph inclusion" 
--- 

# Make a simple plot: 

```{r} 
plot(0,0,main="Attempt 1") 
``` 

Result of above: Plot is displayed during processing and is included in generated document. 


# Make the plot in a separate graphics window: 

```{r} 
windows() # open new graphics window; x11() on Linux, MacOS 
plot(0,0,main="Attempt 2") 
``` 

Result of above: Plot is displayed during processing and is included in generated document. 

# Make the plot in a separate graphics window called from another script: 

```{r} 
writeLines("windows() ; plot(0,0,main='From File')" , 
      con="openWindowScript.R") 
source("openWindowScript.R") 
``` 

Result of above: Plot **is** displayed during Knitr processing but is **NOT** included in the generated document. *Why not?* 

私は、検索stackoverflowの他の場所の答えのためにやったが、1つを見つけることができませんでした。事前にお答えいただきありがとうございます。

+0

P.S. Thorndikeの猫のように、私はR関数とKnitrチャンクオプションのランダムなバリエーションを試しましたが、成功はありませんでした。 'source()'に 'local = TRUE'を設定しても動作しません。チャンクオプションの 'fig.show'と' fig.keep'のさまざまな設定は、少なくとも私のためではありません。 –

+0

'openWindowScript.R'(' source'が使われているかどうかに関わらず)で生成されたプロットを含める*方法を探していますか、外部ファイルを特定の要件にしていますか? –

+0

プロットを作成するために 'windows'(または' x11')を使う既存のRスクリプトがあります。私はRmarkdownのコードチャンクから既存のRスクリプトを実行したいのです。これは、ユーザーがスクリプトをどのように実行するのかという理由から、 'ソース'を付けて実行します。私は既存のRスクリプトを変更したくありません。 (単に私の教科書に付随するスクリプトをRmarkdownで実演したいと思っています。これらのスクリプトは新しいグラフィックスウィンドウにプロットする他のスクリプトです)。 –

答えて

1

sourceコールの後にdev.print()を追加すると、現在のデバイス(あなたの場合は)がsourceによって呼び出されたものでなければなりません。これはknitによってキャプチャされ、ドキュメントに含まれます。だから、チャンクは次のようになります。

```{r} 
writeLines("windows() ; plot(0,0,main='From File')" , 
      con="openWindowScript.R") 
source("openWindowScript.R") 

dev.print() 
``` 

私はデバイスをオープンし、それを印刷の両方のためにX11を使用しますが、ドキュメントはそれとして(Windows上で同じように動作する必要があることを意味すると思わLinuxでは、上でこれをテストしましたWindows固有のバージョンdev.printが正しくインストールされている限り、デフォルトでインストールされます)。

対話的に(迷惑でもクラッシュを引き起こしても)実行されたときにdev.printが問題を引き起こしている場合は、ニット文書の外側で実行されないようにニット文書の名前をチェックすることができます。対話式に実行するとNULLを返しますので、編み込み以外の実行をブロックするにはifの条件として使用できます。このエラーについてのコメントの例を使用

、コードチャンクは、次のようになる。

```{r echo=1:2} 
writeLines("windows() ; plot(0,0,main='Ta-Da!')" , 
      con="theScript.R") 
source("theScript.R") 

if(!is.null(knitr::current_input())){ 
    deviceInfo <- dev.print() 
} 
``` 

別のアプローチは、過剰書き込みwindows()(及び/又はx11)の動作をすることです。あなたのRMD文書の上部には、windowsまたはx11への呼び出しのすべてをキャッチし、基本的に(...は、あなたが「未使用の引数」エラーが出ないことを保証します)それらを無視すべきではどの

x11 <- windows <- function(...){invisible(NULL)} 

を追加します。これらの呼び出しを使用してサイズやアスペクト比を設定する場合は、代わりにfig.widthまたはfig.heightを使用する必要があります。これは、実際にが他のものを壊す可能性があります。 x11/windowsの動作はgrDevices::x11(またはそれに類するものはwindows)を使用すると正しい機能が得られます。あなたがピンチで、最初にwindowsを使用した理由を忘れてしまった場合、これはうまくいくはずです。

+0

'' '{echo = 1:2} \\ writeLines(" windows(); plot(0,0、main = 'Ta-Da!' ) "、con =" theScript.R ")\\ ソース(" theScript.R ")\\ #次の' dev.print'はRmarkdownがドキュメントにプロットを表示するためだけに必要です。変数に戻り値(つまり、デバイスの名前と数)を割り当てて、Rmarkdownドキュメントに表示されないようにする必要があります。 rコードチャンクオプションで 'echo = 1:N'を使います。ここでNはこれより上にある行数です。 \\ deviceInfo = dev.print()\\ '' '\\ (上記の\\は改行を意味します)上記の結果:Knitr-edでは動作しますが、Rコードが単独で実行されているときにRStudio *がクラッシュします。 –

+0

結果を 'deviceInfo'に保存しないとRStudio内でクラッシュしますか? (もしそうなら、チャンクオプション 'results = 'hide'を設定することは回避策になるかもしれません)。私の例とあなたの両方のコードは、私にとってはRStudioをクラッシュさせません(Ubuntuでは、 。私はITを試してみるのは嫌ですが、RStudioを閉じて再オープンしようとしましたか?いずれにしても、編み物をしているかどうかをチェックするために編集しました(あなたがいる場合は 'dev.print'を実行するだけです)。 –

+0

非常に良い!しかし、あなたがここにいる間、もう一つの不具合:ソーススクリプトが複数のウィンドウを開くと、最終的なものだけがドキュメントに含まれます。たとえば、\\ '' '{echo = 1:2} \\ のように書くことができます。 \\ ソース( "theScript2.R")\\ if(!is.null(knitr :: current_input()、0、main = 'Ta-Da TWO!') "、con =" theScript2.R " )){deviceInfo < - dev.print()} \\ '' '\\アイデア? –

1

コードには2つの異なる問題があります。 1つはopenWindowScript.Rのコードで、もう1つはこのファイルがメイン文書にどのように含まれているかです。直接チャンクコードとして使用される場合openWindowScript.R

コードも可視プロットを生成しない。

```{r} 
windows(); plot(0,0,main='From File') 
``` 

私は、これは(例えば上述のトップレベルの表現と他のコードとの間の差に起因していると思うhere )しかし、私は詳細については分かりません。は、目に見えるプロットを何作るん次のコードです:私たちは、ドキュメントに含めることができるか、

```{r} 
windows() 
plot(0,0,main='From File') 
``` 

ので、外部ファイルにこのコードの? source外部ファイルを作成している可能性があります。おそらく、プロットコマンドが再びトップレベルの式ではないからです。マーク・ピーターソンはすでにnice workaroundを提供しますが、私はもっとknitr -idiomaticソリューションを提案したいと思います:code optionを使用して、チャンクにコードを挿入:

```{r} 
writeLines("windows() \n plot(0,0,main='From File')" , 
      con="openWindowScript.R") 
``` 

```{r, code = readLines("openWindowScript.R")} 
``` 
+0

この面白い答えをありがとう。トップレベルの表現の議論へのリンクは明らかであり、dev.print()がなぜ機能するのかを説明するのに役立ちます。私はチャンクオプションとしてcode = readLines()の考え方も好きですが、コードを明示的に 'source'することは、Rmarkdownで説明したいスクリプトの一部です。ありがとうございました! –

+0

私のシステムでは、 'source'dコードがセミコロンではなく改行で、ニット出力に目に見えるプロットを生成しません - あなたのために(' code'オプションや回避策なしで)行いますか?私は対話的に実行されたときにプロット*が印刷されるので、これがトップレベルの問題であるかどうかも分かりません(しかし、トップレベルの問題はしばしば非常に重要です)。私は 'code ='について忘れてしまっていたので、回避策が失敗した場合は非常に良い道が進みました。 'echo = FALSE'と' source'コマンド( 'eval = FALSE'と一緒に)を表示する場所とは別のチャンクとして、これを組み合わせることができます。 –

+0

@MarkPeterson '"私のシステムでは、セミコロンではなく改行でソースコードを作成しても、ニット出力に目立つプロットは生成されません - コードオプションや回避策なしであなたのために行うのですか? 「いいえ、そうではありません。 –

関連する問題