函数内部的ggplot调用:eval中的错误(expr,envir,enclos):找不到对象'...'

时间:2014-04-29 15:00:23

标签: r ggplot2

定义此功能后:

compare <- function(list.a, list.b, selection)
{
  dev.new()
  df <- melt(as.data.frame(t(matrix(c( list.a[selection], list.b[selection]), nrow=2, byrow=TRUE))))
  xaxis <- rep(c(1:length(selection)), 2)
  ggplot(df, aes(x=xaxis, y=value, group=variable)) + geom_line()
}

[编辑]

我刚刚意识到这段代码需要运行两个:

require(ggplot2)
require(reshape)

它可以归纳为这样的单行问题:

compare <- function(list.a, list.b, selection) ggplot() + geom_line(data=melt(as.data.frame(t(matrix(c( list.a[selection], list.b[selection]), nrow=2, byrow=TRUE)))), aes_string(x=rep(1:length(selection), 2), y="value", colour="variable"))

此函数的预期输出是两个值列表(a和b)的折线图,但仅绘制这两个列表中的特定范围(选择);请参阅下面的示例函数调用。

顺便说一下,函数的单行版本确实有效,但输出错误:它产生一行而不是所需的线图。但是,如果我取消引用valuevariable变量(由melt()调用生成 - 实际上是melt.data.frame()),那么我会得到与下面相同的错误(&# 34;找不到对象&#34;),但现在找不到valueobject 'value' not found

这是&#34;默认&#34;,该函数的干净版本;同样的问题,但是:

compare <- function(list.a, list.b, selection)
{
  df <- melt(as.data.frame(t(matrix(c( list.a[selection], list.b[selection]), nrow=2, byrow=TRUE))))
  xaxis <- rep(c(1:length(selection)), 2)
  ggplot(df, aes(x=xaxis, y=value, colour=variable)) + geom_line()
}

使用以下方法调用这些函数的任何版本:

compare(runif(100), runif(100), 30:80)

应该在y轴的[0,1]范围内产生两条线具有随机值的线图,在两个列表中从索引30到80获得51个值。

[/编辑]

但是我收到以下错误:

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

我不知道为什么我会收到此错误或如何防止它。有人可以帮我解决这个问题,并告诉我我做错了什么?

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,并在此处找到答案:Use of ggplot() within another function in R

根据建议,添加environment参数如下所示:

library(reshape2)
library(ggplot2)

compare <- function(list.a, list.b, selection)
{
  df <- melt(as.data.frame(t(matrix(c( list.a[selection], list.b[selection]), nrow=2, byrow=TRUE))))
  xaxis <- rep(c(1:length(selection)), 2)
  # ggplot(df, aes(x=xaxis, y=value, colour=variable)) + geom_line() # fails
  ggplot(df, aes(x=xaxis, y=value, colour=variable),environment=environment()) + geom_line() # works
}

compare(runif(100, 0, 1), runif(100, 0, 1), c(30:80))

答案 1 :(得分:1)

根据我之前的评论,包括&x; xaxis&#39;在你的df数据框中似乎纠正了这个错误。

此代码适用于我

library(reshape2)
library(ggplot2)

compare <- function(list.a, list.b, selection)
  {
  dev.new()
  df <- melt(as.data.frame(t(matrix(c( list.a[selection], list.b[selection]), nrow=2,    byrow=TRUE))))
  df$xaxis <- rep(c(1:length(selection)), 2)
  ggplot(df, aes(x=xaxis, y=value, group=variable)) + geom_line()
}

compare(runif(100, 0, 1), runif(100, 0, 1), c(30:80))

答案 2 :(得分:1)

将您的功能更改为此

compare <- function(list.a, list.b, selection) {
df <- melt(as.data.frame(
                          t(matrix(c(list.a[selection], list.b[selection]), 
                                  nrow = 2, byrow = TRUE))))
print(head(df)) #before adding axis to your df
df$xaxis <- rep(c(1:length(selection)), 2)
print(head(df)) #after adding the axis to your df
ggplot(df, aes(x=xaxis, y=value, colour=variable)) + geom_line()

}

可以删除打印语句,它们可以显示 你ggplot看到了什么。您也可以使用aes_string,但仍需要创建一个新的data.frame,其中包含您传递给ggplot的所有“列”