データフレーム内の各数値フィールドのヒストグラムを生成する自動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)
}
```
_
この時点から、プロットをさらにカスタマイズしたいと考えています。
qplot
でprint
をラップします。
knitr
は、qplot
がループの外側にある場合にそれを行いますが、(少なくともインストールしたバージョンでは)ループ内でこれを検出しません(これは、 Rコマンドライン)。
子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
簡単なメモを追加したい:どういうわけか同じ質問をグーグルで検索し、このページに入りました。 2018年には、ループでprint()
を使用するだけです。
for (i in 1:n){
...
f <- ggplot(.......)
print(f)
}
ヒューゴの優れた答えに加えて、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')`
```