首页 文章

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

提问于
浏览
39

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

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

  • 将绘图保存到对象 p ,然后在循环后调用 p

  • 这只绘制了最终的情节

  • 创建绘图数组 PLOTS <- NULL ,并在循环中附加绘图 PLOTS <- append(PLOTS, p)

  • 从循环中访问这些图根本不起作用

  • 甚至尝试将每个文件保存到 .png 文件,但宁愿不必处理保存然后重新访问每个文件的开销

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

问题

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

在RStudio中使用 knitr 的R markdown块:

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

  • 7

    qplot 包裹在 print 中 .

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

  • 3

    我在降价中使用子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看起来像:
    
    ```java
    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')}
    
    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](https://github.com/hugokoopmans/dataMineR)
  • 35

    作为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')`
    
  • 3

    希望添加一个快速注释:不知何故,我用Google搜索了相同的问题并进入此页面 . 现在在2018年,只需在循环中使用 print() .

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

相关问题