在 For 循环中的输出图

我想创建一个自动编织报告,将生成每个数字字段在我的数据框直方图。我的目标是在不指定实际字段的情况下做到这一点(这个数据集包含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)
}
```

从这一点出发,我希望进一步定制情节。

36470 次浏览

print中包装 qplot

如果 qplot位于循环之外,那么 knitr将为您执行此操作,但是(至少在我安装的版本中)在循环内部没有检测到这一点(这与 R 命令行的行为一致)。

我使用子 Rmd 文件在减价,也作品在交织。

在 Rmd 中使用以下片段:

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

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

作为雨果出色回答的补充,我认为在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')`
```

我想补充一点: 不知怎么的,我谷歌了同样的问题,进入了这个页面。 现在在2018年,只要在循环中使用 print()

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

为了将 Rmd 编织成 HTML,我发现有一个图表列表更方便。在这种情况下,我用 results='hide'得到了理想的输出,如下所示:

---
title: "Make a list of figures and show it"
output:
html_document
---




```{r}
suppressPackageStartupMessages({
library(ggplot2)
library(dplyr)
requireNamespace("scater")
requireNamespace("SingleCellExperiment")
})
```




```{r}
plots <- function() {
print("print")
cat("cat")
message("message")
warning("warning")
  

# These calls generate unwanted text
scater::mockSCE(ngene = 77, ncells = 33) %>%
scater::logNormCounts() %>%
scater::runPCA() %>%
SingleCellExperiment::reducedDim("PCA") %>%
as.data.frame() %>%
{
list(
f12 = ggplot(., aes(x = PC1, y = PC2)) + geom_point(),
f22 = ggplot(., aes(x = PC2, y = PC3)) + geom_point()
)
}
}
```


```{r, message=FALSE, warning=TRUE, results='hide'}
plots()
```

只显示了情节和警告(您也可以关闭它们)。