0

我不明白如何在某些格子图中处理存储在 data.frame 中的对象。在第二个图中,我得到下面的错误消息。有可能让它工作吗?

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'
4

2 回答 2

1

转换x为数字更正问题

    x <- x[[1]]
    panel.xyplot(as.numeric(x),.5,col=2)
于 2012-12-15T06:22:23.237 回答
1

来自?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并超出了绘制值的范围。当然,可以通过使用自定义预面板功能来纠正此问题。

于 2012-12-16T10:47:05.140 回答