来自?ecdfplot:
对于“公式”方法,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此外, in的公式参数ecdfplot还必须表示ecdfplot函数可以处理的数据,即不是列表,如上所述。
在下面的示例中,我将 data.framedata4两次传递给 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并超出了绘制值的范围。当然,可以通过使用自定义预面板功能来纠正此问题。