ggplot2里面的功能与第二个美学:范围界定问题 [英] ggplot2 inside function with a 2nd aesthetic: scoping issue

查看:163
本文介绍了ggplot2里面的功能与第二个美学:范围界定问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下测试数据:

  structure(list(r = c(5.44702625911984,6.3431860464319,2.89023592667928,
6.66260769449341,7.5521021076857,5.50645078944005,6.70001850525037,
7.39615449137166,5.96032231142622,7.88929821115731,9.45119299499902,
6.13534105776075,7.79397401855071,5.24488870603935,4.53178061905952,
5.80573244536445,10.1194252475799,12.5794215385996,7.47503723957468,
7.8682648760597,15.7540766770233,14.9800818974568,14.5672865569748,
9.5347507057429,18.6791666362954,10.4588651710497,15.2076130678251,
10.5052588219606,13.1314628288852,12.8384811800557,10.9978569438483,
10.0197995395016,10.1479274794689,12.5864754383382,10.7985399338233,
11.1100572430765, 10.756576992292,9.17309427876051,10.0441987112265,
10.0652520950654),f1 =结构(c(2L,2L,2L,2L,2L,2L,2L,
2L,2L,2L,2L,2L,2L,2L ,2L,2L,2L,2L,2L,2L,1L,1L,1L,
1L,1L,1L,1L,1L, 1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,
1L),。标签= c(H,L),class =factor f2 =结构(c(1L,
1L,1L,1L,1L,1L,1L,1L,1L,1L,2L,2L,2L,2L,2L,2L,2L,
2L, 2L,2L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,2L,2L,2L,
2L,2L,2L,2L,2L,2L,2L) =factor,.Label = c(Joe,
Sally))),.Names = c(r,f1,f2),row.names = c(NA ,-40L
),class =data.frame)

以下函数它应该画点(它),并连接每个组的手段(它不):

  testFunc< - 公式[[3]]  - 函数(公式= NULL,数据= NULL){
res< - as.character(公式[[2]])
fac1 < - as.character (公式[[3]] [3])

#指定数据&美学
p < - ggplot(数据,aes_string(x = fac1,y = res,color = fac2,
group = fac2))

#现在添加点
p< - p + geom_point()#可以正常工作,如果我们在这里停止

#由于ggplot2_0.9.3中的错误,我们必须计算一些数量
#并将它们放在一个单独的(数据[,res]〜data [,fac1] * data [,fac2],数据,FUN =平均)
名称(avg)< - c(factor1,factor2,mean)
p <-p + geom_line(aes_string(x ='factor1',y ='mean',group ='factor2'),data = avg )
}

当我运行它时:

  ex < -  testFunc(formula = r〜f1 * f2,data = td)
print(ex)

出现此错误:

  eval(expr,envir,enclos):object'f2'not found 

我似乎总是会有这些范围问题,任何广告副?我认为我正在为错误采取适当的解决方法。使用 aes 而不是 aes_string ,或者不引用 geom_line 不能解决它。当我遇到继承美学的麻烦时,我总是回去并从主<$ c $中删除任何东西c> ggplot()调用不需要在那里。试试这个:

  testFunc<  -  function(formula = NULL,data = NULL){
res< - (formula [[2]])
fac1 < - as.character(formula [[3]] [2])
fac2 < - as.character(formula [[3] ] [3])

#现在加点
p < - ggplot()+ geom_point(data = data,aes_string(x = fac1,y = res,color = fac2,
group = fac2))#如果我们在这里停止,就可以正常工作

#由于ggplot2_0.9.3中的错误,我们必须计算一些数量
#并将它们放在一个单独的数据框中(data [,res]〜data [,fac1] * data [,fac2],data,FUN = mean)
names(avg)< - c (factor1,factor2,mean)
p <-p + geom_line(aes_string(x ='factor1',y ='mean',group ='factor2'),data = avg)
}


I have the following test data:

structure(list(r = c(5.44702625911984, 6.3431860464319, 2.89023592667928, 
6.66260769449341, 7.5521021076857, 5.50645078944005, 6.70001850525037, 
7.39615449137166, 5.96032231142622, 7.88929821115731, 9.45119299499902, 
6.13534105776075, 7.79397401855071, 5.24488870603935, 4.53178061905952, 
5.80573244536445, 10.1194252475799, 12.5794215385996, 7.47503723957468, 
7.8682648760597, 15.7540766770233, 14.9800818974568, 14.5672865569748, 
9.5347507057429, 18.6791666362954, 10.4588651710497, 15.2076130678251, 
10.5052588219606, 13.1314628288852, 12.8384811800557, 10.9978569438483, 
10.0197995395016, 10.1479274794689, 12.5864754383382, 10.7985399338233, 
11.1100572430765, 10.756576992292, 9.17309427876051, 10.0441987112265, 
10.0652520950654), f1 = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("H", "L"), class = "factor"), f2 = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L), class = "factor", .Label = c("Joe", 
"Sally"))), .Names = c("r", "f1", "f2"), row.names = c(NA, -40L
), class = "data.frame")

And the following function which should draw the points (it does) and connect the means of each group (it doesn't):

testFunc <- function(formula = NULL, data = NULL) {
    res <- as.character(formula[[2]])
    fac1 <- as.character(formula[[3]][2])
    fac2 <- as.character(formula[[3]][3])

    # Specify the data & aesthetics     
    p <- ggplot(data, aes_string(x = fac1, y = res, color = fac2,
        group = fac2))

    # Now add points
    p <- p + geom_point() # works fine if we stop here

    # Due to a bug in ggplot2_0.9.3, we must calc some quantities
    # and put them in a separate data frame for a new aesthetic
    avg <- aggregate(data[,res] ~ data[,fac1]*data[, fac2], data, FUN = mean)
    names(avg) <- c("factor1", "factor2", "mean")   
    p <- p + geom_line(aes_string(x = 'factor1', y = 'mean', group = 'factor2'), data = avg)
    }

When I run it:

ex <- testFunc(formula = r ~ f1*f2, data = td)
print(ex)

I get this error:

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

I seem to always have these scoping problems, any advice? I thought I was following the appropriate work-around for the bug. Using aes instead of aes_string, or not quoting the variable names in geom_line doesn't fix it. Thanks.

解决方案

When I run into trouble with inherited aesthetics, I always go back and remove anything from the main ggplot() call that doesn't need to be there. Try this:

testFunc <- function(formula = NULL, data = NULL) {
    res <- as.character(formula[[2]])
    fac1 <- as.character(formula[[3]][2])
    fac2 <- as.character(formula[[3]][3])

    # Now add points
    p <- ggplot() + geom_point(data = data, aes_string(x = fac1, y = res, color = fac2,
        group = fac2)) # works fine if we stop here

    # Due to a bug in ggplot2_0.9.3, we must calc some quantities
    # and put them in a separate data frame for a new aesthetic
    avg <- aggregate(data[,res] ~ data[,fac1]*data[, fac2], data, FUN = mean)
    names(avg) <- c("factor1", "factor2", "mean")   
    p <- p + geom_line(aes_string(x = 'factor1', y = 'mean', group = 'factor2'), data = avg)
    }

这篇关于ggplot2里面的功能与第二个美学:范围界定问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆