定义此功能后:
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)的折线图,但仅绘制这两个列表中的特定范围(选择);请参阅下面的示例函数调用。
顺便说一下,函数的单行版本确实有效,但输出错误:它产生一行而不是所需的线图。但是,如果我取消引用value
和variable
变量(由melt()
调用生成 - 实际上是melt.data.frame()
),那么我会得到与下面相同的错误(&# 34;找不到对象&#34;),但现在找不到value
:object '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
我不知道为什么我会收到此错误或如何防止它。有人可以帮我解决这个问题,并告诉我我做错了什么?
答案 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的所有“列”