R ggplot for循环aes变量

时间:2015-08-14 07:12:22

标签: r for-loop ggplot2

我有一个数据框<div class="modal fade" id=editUserPopUp tabindex="-1" role="dialog" aria-labelledby="helpModalLabel" aria-hidden="true"> <div class="modal-dialog "> <div class="modal-content"> <div class="modal-header"> <h4 class="modal-title" id="myModalLabel">Update Password</h4> </div> <div class="modal-body"> <form class="EditUserBody" role="form" id="usermanagement_editUser="novalidate" method="POST"> <div class="input-group col-md-8"> <span class="input-group-addon">User Name</span> <input class="form-control" id="userName" type="text" class="input-medium" disabled /> </div> </form> </div> </div> </div> </div> ,我试图用for循环绘制。我在函数中使用forloop绘制ggplots的原因是因为我想多次调用此函数。

dat

我继续收到错误:

  

eval中的错误(as.symbol(x_val)):     评估论证时的错误&#39; expr&#39;选择函数的方法&#39; eval&#39;:as.symbol(x_val)中的错误:object&#39; x_val&#39;找不到

当我尝试调用这样的函数时:

> head(dat)
      tpl     motif strand base score ipdRatio
1:  24501 AAGTACTCG      0    A    51    3.108
2:  58809 GAGTACTAC      0    A    69    4.095
3:  65614 TAGTACTCA      0    A    61    3.341
4:  78494 GAGTACTAC      0    A    92    4.968
5:  92127 AAGTACTTA      0    A    23    1.702
6: 193102 GAGTACTCG      0    A    96    5.255

有关可能导致错误的原因的任何建议吗?

2 个答案:

答案 0 :(得分:1)

我能够找到解决方案,我只需使用aes_string代替aes来调用变量aes列值。

像这样:

plotme <- function(dataf,x_val,bin_width){
  print(ggplot(dataf, aes_string(x = x_val)) +
          geom_histogram(binwidth = bin_width))
}

ratioplot <- plotme(dat,"ipdRatio",15)

答案 1 :(得分:0)

首先,我更喜欢aes()而不是aes_string,然后只需要

if (is.character(x_val)) {x_val <- which(names(dataf) == x_val)}

这样,您可以在引用列时将其称为数字或字符。

其次,你所做的功能有问题。

尝试完全清除你的工作,并运行这个:

dat <- data.frame(ipdRatio=rnorm(100));library(ggplot2)

plotme <- function(dataf,x_val,bin_width){
        localEnv <- environment()
        if (is.character(x_val)) {x_val <- which(names(dataf) == x_val)}
        print(ggplot(dataf, aes(x = dataf[,x_val])) +
                      geom_histogram(binwidth = bin_width))
}

ratioplot <- plotme(dataf=dat,"ipdRatio",.5)

将返回

Error in eval(expr, envir, enclos) : object 'dataf' not found

函数调用dataf = dat根本没有制作,现在它适用于你的原因是因为你的全局环境中有dataf。

更改功能以将环境指定为本地

dat <- data.frame(ipdRatio=rnorm(100));

plotme <- function(dataf,x_val,bin_width){
        localEnv <- environment()
        if (is.character(x_val)) {x_val <- which(names(dataf) == x_val)}
        print(ggplot(dataf, aes(x = dataf[,x_val]),environment=localEnv) +
                      geom_histogram(binwidth = bin_width))
}

ratioplot <- plotme(dataf=dat,"ipdRatio",.5)