2017-11-14 10 views
0

Windows 7の64ビットで、私は最近RStudio 1.1.383とrmarkdown 1.7にアップデートしました。私はrenderを使用してRmdファイルからpdfを作成していますので、私は新しい動作に気付きました。RStudio 1.1.383とrmarkdown 1.7環境のenheritance

  1. あり、地球環境との間のリークと編み環境があり、それは両方の方法を行く:私は.Rmdファイルでx = 12を定義すると、レンダリングが完了した後
  2. 、私は地球環境にxを見つけます。
  3. 私は.Rmdに未定義の変数yを使用して、私は漏れが発生していない私はRStudioからニットない場合は、yが.Rmd
  4. の編成に使用されているrenderを使用する前に、地球環境にy=1000を設定した場合グローバル環境でyが定義されていても、.Rmdを編成するとエラーが発生します(yが見つかりません)。

誰でも知っていますか?私は環境を分けることは、時には苦しいことがあるにせよ、再現性を確保するためには非常に重要だと考えています。ここで

は私sessionInfo()次のとおりです。ここで

> sessionInfo() 
R version 3.4.2 (2017-09-28) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 

Matrix products: default 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] rmarkdown_1.7 

loaded via a namespace (and not attached): 
[1] compiler_3.4.2 backports_1.1.1 magrittr_1.5 rprojroot_1.2 htmltools_0.3.6 tools_3.4.2  yaml_2.1.14  Rcpp_0.12.13 
[9] stringi_1.1.5 knitr_1.17  stringr_1.2.0 digest_0.6.12 evaluate_0.10.1 

は、最小限の "テストrender.R" ファイルです:

library(rmarkdown) 
y=1000 
render(input = "test render.Rmd") 

。ここで、最小限のファイルを "テストはrender.Rmd" されます

--- 
title: "test render" 
author: "Courvoisier" 
output: pdf_document 
--- 

## R Markdown 

```{r cars} 
x = 12 
print(y) 
``` 

ここにはpdf結果があります。

enter image description here

+0

コマンドラインを介して、例えば自分で別のRセッションで文書をレンダリングすることです: //community.rstudio.com/。 – lmo

+0

真実ですが、最初に入れておくことをお勧めします – Courvoisier

+0

もしも助けがあれば、昨日私は信じて、1.6と1.5に関連した変化をたくさん持っています。 – lmo

答えて

1

私が言うことができる限り、この動作は1日目以降存在しています。これを証明する方法があります。あなたはyは(私が期待するよう)に印刷された参照

library(rmarkdown) 
y = 1000 
render(input = "test render.Rmd") 

devtools::install_version('rmarkdown', '0.3.3') 

そして、あなたの例を実行します。まずrmarkdownfrom the CRAN archiveの非常に最初のバージョン(0.3.3)をインストール

rmarkdown 0.3.3

この動作は仕様です。なぜこの動作がわかりませんあなたに驚く。 Rでは、グローバル変数はどこからでも(定義によって)アクセスできます。グローバル環境でyを定義したので、R Markdownのドキュメントでアクセス可能であることを期待する必要があります。

Rマークダウン文書は、parent.frame()render()の環境でコンパイルされ、この環境ですべての変数が作成されます。お客様のケースでは、parent.frame()は地球環境(globalenv())です。その理由は、xがグローバル環境で作成された理由を説明しています。

RStudioの[ニット]ボタンをクリックすると、別の新しい(クリーンな)Rセッションでドキュメントがコンパイルされるため、これは異なります。現在のRセッションで定義した変数yは、新しいRセッションでは使用できません。同様に、xは新しいセッションで作成され、現在のRセッションでは作成されません。再現性は、現在のRセッションではなく、新しいRセッションでR Markdown文書をコンパイルすることを選択した理由です。ドキュメントが新しいRセッションで動作する場合は、再現性が高い可能性があります。現在のRセッション(rmarkdown::render()経由)で動作する場合は、偶然にもうまくいくかもしれません。

コードチャンクを別の環境で評価する必要がある場合は、引数envirを明示的に使用する必要があります(例:

render(input = "test.Rmd", envir = new.env()) 

この方法で、xは、グローバル環境で作成されませんが、yは(グローバル変数の定義によって、再び)コードチャンクに利用できるようになります。

私たちのように再現性を本当に気にしていれば、簡単な方法とやや難しい方法があります。簡単な方法はRStudioでニットのボタンをクリックすることで、困難な方法は、これは、HTTPのためのより良い質問かもしれ

Rscript -e "rmarkdown::render('test.Rmd')" 
関連する問題