我不明白如何在某些格子图中处理存储在data.frame中的对象。在第二个图中我得到错误消息msg。有可能让它发挥作用吗?
require(lattice)
require(latticeExtra)
data<-data.frame(a=I(list(1,2,3)),b=factor(1:3))
ecdfplot(~a|b,data=data
,layout=c(1,3)
,panel=function(x,...){
print(x[[1]])
panel.xyplot(x[[1]],.5,col=2)
}
)
data<-data.frame(a=I(list(diag(1,2,2),diag(1,2,2),diag(1,2,2))),b=factor(1:3))
ecdfplot(~a|b,data=data
,layout=c(1,3)
,panel=function(x,...){
print(x[[1]][1,1])
panel.xyplot(x[[1]][1,1],.5,col=2)
}
)
Error in prepanel.default.function(darg = list(give.Rkern = FALSE, n = 50, :
(list) object cannot be coerced to type 'double'
答案 0 :(得分:1)
将x
转换为数字更正问题
x <- x[[1]]
panel.xyplot(as.numeric(x),.5,col=2)
答案 1 :(得分:1)
来自?ecdfplot
:
对于&#34;公式&#34;方法,x是描述条件图形式的公式,并且必须是~x形式,其中x被假定为数字向量。
如果x
(在您的情况下变量a
)不是数字,则会在路上的许多点通过as.numeric
强制进行绘制。其中一个点在prepanel
函数中。
在您的第一个data
对象中,data$a
可以在没有错误的情况下被强制转换为数字(双)向量。在您的第二个data
对象中,无法成功强制data$a
。
> as.numeric(data$a)
Error: (list) object cannot be coerced to type 'double'
即使您指定了一个应该有效的panel
函数,prepanel
函数也会抛出错误。
更新:
有一种方法可以将任意对象传递给面板函数,这可以通过ecdfplot
的省略号传递参数来完成。必须以与普通晶格函数中的任何命名参数不匹配的方式命名参数(并且最好避免使用的面板函数中的任何命名参数)。此外,x
中ecdfplot
的公式参数还必须表示ecdfplot
函数可以处理的数据,即不是列表,如上所述。
在下面的示例中,我将data.frame data4
两次传递给plot函数:一次作为参数data
,一次通过省略号作为参数plotData
。这会将整个data.frame传递给面板函数,因此有必要将subscripts
传递给面板函数,以便可以下载适当的数据。
# New example data
data4 <- data.frame(a = 0:2, b = factor(1:3),
forPrint = letters[1:3],
forXyplot = I(list(list(x = seq(0, 1, .25), y = rev(seq(0, 1, .25))),
list(x = seq(0, 1, .5), y = rev(seq(0, 1, .5))), list(x = seq(0, 1, .2),
y = rev(seq(0, 1, .2))))))
> data4
a b forPrint forXyplot
1 0 1 a c(0, 0.2....
2 1 2 b c(0, 0.5....
3 2 3 c c(0, 0.2....
ecdfplot(~ a|b, data = data4
,layout=c(1,3)
,panel=function(x, subscripts = subscripts, ...){
# plotData is passed to the panel function via the ellipses,
# so extract those arguments vial match.call
args <- match.call(expand.dots = FALSE)$...
# Print the column forPrint
print(args$plotData$forPrint[subscripts])
# Plot the forXyplot column using do.call, since the column is
# a list with x and y items.
do.call(panel.xyplot, c(args$plotData[subscripts, "forXyplot"][[1]],
col=2))
}
,plotData = data4
)
您将从图中注意到x轴限制涵盖a
的范围并超出绘制值的范围。当然,可以通过使用自定义预付费功能来纠正这个问题。