web-dev-qa-db-ja.com

R knitr Markdown:Forループ内の出力プロット

データフレーム内の各数値フィールドのヒストグラムを生成する自動knitrレポートを作成したいと思います。私の目標は、実際のフィールドを指定せずにこれを実行することです(このデータセットには70を超えるデータが含まれており、スクリプトも再利用したいと思います)。

私はいくつかの異なるアプローチを試しました:

  • プロットをオブジェクトpに保存し、ループの後にpを呼び出す
    • これは最終プロットのみをプロットします
  • プロットの配列_PLOTS <- NULL_を作成し、ループ内にプロットを追加PLOTS <- append(PLOTS, p)
    • ループからこれらのプロットにアクセスしてもまったく機能しませんでした
  • それぞれを_.png_ファイルに保存しようとしましたが、各ファイルを保存して再アクセスするオーバーヘッドを処理する必要はありません

プロットデバイスの複雑さが私を逃れているのではないかと心配しています。

質問

ループ内の各プロットをレポートに出力するには、次のようにしますか?現在、私が達成できる最善の方法は、オブジェクトに保存し、ループの外側でそのオブジェクトを呼び出すことによって生成される最終プロットの出力です。

RStudioでknitrを使用したRマークダウンチャンク:

_```{r plotNumeric, echo=TRUE, fig.height=3}
suppressPackageStartupMessages(library(ggplot2))
FIELDS <- names(df)[sapply(df, class)=="numeric"]
for (field in  FIELDS){
  qplot(df[,field], main=field)  
}
```
_

この時点から、プロットをさらにカスタマイズしたいと考えています。

45
bnjmn

qplotprintをラップします。

knitrは、qplotがループの外側にある場合にそれを行いますが、(少なくともインストールしたバージョンでは)ループ内でこれを検出しません(これは、 Rコマンドライン)。

43
cbeleites

子Rmdファイルをマークダウンで使用していますが、sweaveでも動作します。

rmdでは、次のスニペットを使用します。

```{r run-numeric-md, include=FALSE}
out = NULL
for (i in c(1:num_vars)) {
  out = c(out, knit_child('da-numeric.Rmd'))
}
```

da-numeric.Rmdは次のようになります。

Variabele `r num_var_names[i]`
------------------------------------

Missing :  `r sum(is.na(data[[num_var_names[i]]]))`  
Minimum value : `r min(na.omit(data[[num_var_names[i]]]))`  
Percentile 1 : `r quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[2]`  
Percentile 99 : `r quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[100]`  
Maximum value : `r max(na.omit(data[[num_var_names[i]]]))`  

```{r results='asis', comment="" }
warn_extreme_values=3
d1 = quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[2] > warn_extreme_values*quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[1]
d99 = quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[101] > warn_extreme_values*quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[100]
if(d1){cat('Warning : Suspect extreme values in left tail')}
if(d99){cat('Warning : Suspect extreme values in right tail')}
```

``` {r eval=TRUE,  fig.width=6, fig.height=2}
library(ggplot2)

v <- num_var_names[i]
hp <- ggplot(na.omit(data), aes_string(x=v)) + geom_histogram( colour="grey", fill="grey", binwidth=diff(range(na.omit(data[[v]]))/100))

hp + theme(axis.title.x = element_blank(),axis.text.x = element_text(size=10)) + theme(axis.title.y = element_blank(),axis.text.y = element_text(size=10))

```

githubで私のdatamineRパッケージを参照してください https://github.com/hugokoopmans/dataMineR

9
Hugo Koopmans

簡単なメモを追加したい:どういうわけか同じ質問をグーグルで検索し、このページに入りました。 2018年には、ループでprint()を使用するだけです。

for (i in 1:n){
...
    f <- ggplot(.......)
    print(f)
}
4
Yang Liu

ヒューゴの優れた答えに加えて、2016年には printコマンドも を含める必要があると思います。

```{r run-numeric-md, include=FALSE}
out = NULL
for (i in c(1:num_vars)) {
  out = c(out, knit_child('da-numeric.Rmd'))
}

`r paste(out, collapse = '\n')`
```
3
Alex