R knitr Markdown:For循环中的输出图

bnj*_*jmn 46 r ggplot2 rstudio knitr

我想创建一个自动编织器报告,它将为我的数据帧中的每个数字字段生成直方图.我的目标是在不必指定实际字段的情况下执行此操作(此数据集包含超过70个,我还想重用该脚本).

我尝试过几种不同的方法:

  • 将绘图保存到对象,p然后p在循环 后调用
    • 这只绘制了最终的情节
  • 创建一个绘图数组PLOTS <- NULL,并在循环中附加绘图PLOTS <- append(PLOTS, p)
    • 从循环中访问这些图并不起作用
  • 甚至尝试将每个.png文件保存到文件中,但不必处理保存然后重新访问每个文件的开销

我担心情节设备的复杂性正在逃避我.

如何将循环内的每个绘图输出到报告中?目前,我能做到的最好的是输出最终绘图,将其保存到对象并在循环外调用该对象.

knitr在RStudio中使用R markdown chunk :

```{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)  
}
```
Run Code Online (Sandbox Code Playgroud)

从这一点来说,我希望进一步定制这些图.

cbe*_*ica 44

包裹qplot进去print.

knitr如果qplot它在循环之外会为你做,但(至少我安装的版本)没有在循环内检测到这一点(这与R命令行的行为一致).


Yan*_*Liu 12

希望添加一个简短的说明:不知何故,我用谷歌搜索了相同的问题并进入了此页面。现在在 2018 年,只需print()在循环中使用。

for (i in 1:n){
...
    f <- ggplot(.......)
    print(f)
}
Run Code Online (Sandbox Code Playgroud)

  • 查看代码很有帮助,因为它是直接的并且使抽象在视觉上显而易见。 (5认同)
  • 这对于初学者来说是有意义的。接受的答案没有。因此这个答案更好。 (3认同)

Hug*_*ans 10

我在降价中使用子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'))
}
```
Run Code Online (Sandbox Code Playgroud)

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))

```
Run Code Online (Sandbox Code Playgroud)

在github上查看我的datamineR包 https://github.com/hugokoopmans/dataMineR