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

时间:2012-08-14 16:14:54

标签: r ggplot2 knitr rstudio

我想创建一个自动编织器报告,它将为我的数据框中的每个数字字段生成直方图。我的目标是在不必指定实际字段的情况下执行此操作(此数据集包含超过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)  
}
```

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

5 个答案:

答案 0 :(得分:41)

qplot换入print

如果knitr在循环之外,

qplot将为您执行此操作,但(至少我已安装的版本)未在循环内检测到此内容(这与行为一致) R命令行)。

答案 1 :(得分:9)

我在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

答案 2 :(得分:4)

希望添加一个快速注释: 我莫名其妙地用谷歌搜索了同样的问题并进入该页面。 现在到了2018年,只需在循环中使用987ABC11-15; 77; 877; 987ABC66-68 987ABC11-15; 77; 987ABC877; 987ABC66-68 987ABC11-15; 987ABC77; 987ABC877; 987ABC66-68 987ABC11-987ABC15; 987ABC77; 987ABC877; 987ABC66-68

print()

答案 3 :(得分:3)

作为雨果优秀答案的补充,我相信在2016年你需要加入print command as well

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter .ViewHolder>{
              .....
     public void addNewDataset(ArrayList<Integer> data) {
         ......
      notifyDataSetChanged();
    }
}

答案 4 :(得分: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()
```

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