69

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

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

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

恐怕情节装置的复杂性正在逃避我。

问题

如何使以下块输出循环中的每个图到报告中?目前,我能做到的最好的结果是通过将其保存到一个对象并在循环之外调用该对象来生成最终绘图的输出。

knitr在 RStudio 中使用的 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)  
}
```

从这一点来说,我希望进一步定制情节。

4

5 回答 5

59

qplot进去print

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

于 2012-08-15T09:46:05.637 回答
16

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

for (i in 1:n){
...
    f <- ggplot(.......)
    print(f)
}
于 2018-07-18T21:20:31.267 回答
11

我在 markdown 中使用子 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

于 2013-06-14T09:52:19.040 回答
3

作为 Hugo 出色答案的补充,我相信在 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')`
```
于 2016-12-12T04:30:38.427 回答
0

对于将 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()
```

仅显示绘图和警告(您也可以将其关闭)。

于 2021-06-04T15:52:53.190 回答