0

I do not understand how to handle objects, stored in a data.frame, in certain lattice plots. In the second plot I get the error msg bellow. Is it possible to get it to work?

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

から?ecdfplot:

"式" メソッドの場合、x は条件付けプロットの形式を表す式であり、~x の形式である必要があります。ここで、x は数値ベクトルであると想定されます。

(あなたxの場合、変数a)が数値でない場合as.numeric、道に沿った多くのポイントで強制されてプロットされます。それらのポイントの 1 つはprepanel機能にあります。

最初のdataオブジェクトでdata$aは、エラーなしで数値 (double) ベクトルに強制できます。2 番目のdataオブジェクトでは、data$a正常に強制できません。

> as.numeric(data$a)
Error: (list) object cannot be coerced to type 'double'

panel機能するはずの関数を指定しても、そのprepanel関数はエラーをスローします。


明確化後の更新:

パネル関数に任意のオブジェクトを渡す方法があり、これは の省略記号を介して引数を渡すことによって行われecdfplotます。引数は、通常のラティス関数の名前付き引数と一致しない方法で名前を付ける必要があります (使用するパネル関数で名前付き引数を避けるのが最善です)。xさらに、 inへの Formula 引数はecdfplot、関数が処理できるデータを表す必要がありますecdfplot。つまり、上で説明したように、リストではありません。

以下の例では、data.framedata4を plot 関数に 2 回渡して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の範囲がプロットされた値の範囲をカバーし、範囲を超えていることがわかります。もちろん、カスタム prepanel 関数を使用してこれを修正することもできます。

于 2012-12-16T10:47:05.140 に答える
1

x数値に変換して問題を修正する

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