【问题标题】:R knitr Markdown: Output Plots within For LoopR knitr Markdown:For循环内的输出图
【发布时间】:2012-08-10 23:51:00
【问题描述】:

我想创建一个自动 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)  
}
```

从这一点开始,我希望进一步自定义剧情。

【问题讨论】:

  • 是的。我必须承认我是新手……
  • 我已将 knitr 标签添加到您的问题和标题中,以明确您正在使用的内容。
  • 您是不是忘记将qplot 包裹在print 中?如果qplot 在循环之外,knitr 将为您执行此操作,但是(至少我安装的版本)在循环内没有检测到这一点(这与 R 命令行的行为一致)。
  • @cbeleites 您可能应该对此做出回答,以便 OP 可以接受。
  • 有类似的问题。尝试将分析和 ggplot 图循环到 .Rmd 文件中。但是在循环运行后没有数字或分析输出打印。任何想法为什么?

标签: r ggplot2 knitr rstudio


【解决方案1】:

qplot 包裹在print 中。

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

【讨论】:

  • 有类似的问题。尝试将分析和 ggplot 图循环到 .Rmd 文件中。但是在循环运行后没有数字或分析输出打印。任何想法为什么?
  • 这很好用,除了当我打印图表时它们出现故障的事实。知道那里可能会发生什么
  • 谁能解释为什么你必须把整个东西都包起来而不是在最后打印?例如 ggplot(......) %>% print()
  • @jzadra:你也可以这样做。您仍然需要将 (ggplot() + geom_* ()) 包裹在括号中以使管道正常工作 - 否则由于运算符优先级,您将只能打印添加到 ggplot 中的最后一个对象。 (至于为什么答案中没有这个:当我写那个答案时,管道还没有出现)。
  • @cbeleitessupportsMonica 谢谢。伙计,我希望 Hadley 重写 ggplot3 以使用管道。
【解决方案2】:

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

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

【讨论】:

  • 这就是 "wrap qplot in print" 的字面意思,也就是说,这只是重申了接受的答案。
  • 查看代码很有帮助,因为它是直接的,并且使摘要在视觉上很明显。
【解决方案3】:

我在 markdown 中使用子 Rmd 文件,也适用于 sweave。

在 Rmd 中使用以下 sn-p:

```{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

【讨论】:

  • 嘿 :) knit_child() 函数从何而来?
  • 这为创建图形标题和添加其他细节提供了更大的灵活性,而不是接受的答案。您可以使用选项“fig.caption”并为循环的每次迭代更改块名称。
  • 是否可以引用针织标签而不是单独的文件?
【解决方案4】:

作为对 Hugo 出色回答的补充,我相信在 2016 年你需要包含一个print command as well

```{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')`
```

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-08
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2017-11-16
      • 2017-05-14
      • 2022-11-11
      相关资源
      最近更新 更多