任意对象作为晶格函数的参数

时间:2012-12-15 05:53:12

标签: r lattice

我不明白如何在某些格子图中处理存储在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'

2 个答案:

答案 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的省略号传递参数来完成。必须以与普通晶格函​​数中的任何命名参数不匹配的方式命名参数(并且最好避免使用的面板函数中的任何命名参数)。此外,xecdfplot的公式参数还必须表示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的范围并超出绘制值的范围。当然,可以通过使用自定义预付费功能来纠正这个问题。