2

R 2.15.3以下は、ggplot2 0.9.3.1およびgtable 0.1.2Debian スクイーズでテストされました。

この ggplot2 の問題をデバッグする過程で 、特定のケースで annotation_custom への複数の呼び出しが失敗するため、デバッグ方法がわからないものに遭遇しました。関連情報github-ggplot2-817を使用して Bitbucket にリポジトリを作成しました 。

そのリポジトリからの関連するREADMEを以下にコピーします。Mercurial を使用したくない場合は、シリアル化された R データを含む関連ファイルをaddgrob.asc.saveから直接ダウンロードできます。

を再現するには、 https: //bitbucket.org/faheem/gtable-debianaddgrob.asc.saveの Debian パッケージを使用するか、必要に応じてスクリプトsave.Rと共にgtableaddgrob.diffへのパッチのみを使用できます。gtable

str問題の概要:オブジェクト (ここでは と呼ばれる) でR の関数を実行すると、 がロードされxている場合はエラーが発生しますggplot2が、そうでない場合は発生しません。何が起こっているのかわからないので、ポインタをいただければ幸いです。

###############################################################

このバグを再現するには、次の手順を実行します。

R を起動します。

> ls()
character(0)
> load("addgrob.asc.save")
> ls()
[1] "grobs"  "layout" "x"

> str(x, max.level=1)
List of 10
 $ grobs   :List of 8
 $ layout  :'data.frame':       8 obs. of  7 variables:
   $ widths  :Class 'unit'  atomic [1:6] 1.5 6.096 0.762 1.961 0 ...
  .. ..- attr(*, "unit")= chr "mm"
  .. ..- attr(*, "valid.unit")= int 7
 $ heights :Class 'unit'  atomic [1:7] 1.5 2.53 1.52 6.1 6.1 ...
  .. ..- attr(*, "unit")= chr "mm"
  .. ..- attr(*, "valid.unit")= int 7
 $ respect : logi FALSE
 $ rownames: NULL
 $ colnames: NULL
 $ name    : chr "layout"
 $ gp      : NULL
 $ vp      : NULL
 - attr(*, "class")= chr [1:3] "gtable" "grob" "gDesc"

## Now update x
> x$grobs <- c(x$grobs, grobs)
> x$layout <- rbind(x$layout, layout)

> str(x, max.level=1)
List of 10
 $ grobs   :List of 11
 $ layout  :'data.frame':       11 obs. of  7 variables:
   $ widths  :Class 'unit'  atomic [1:6] 1.5 6.096 0.762 1.961 0 ...
  .. ..- attr(*, "unit")= chr "mm"
  .. ..- attr(*, "valid.unit")= int 7
 $ heights :Class 'unit'  atomic [1:7] 1.5 2.53 1.52 6.1 6.1 ...
  .. ..- attr(*, "unit")= chr "mm"
  .. ..- attr(*, "valid.unit")= int 7
 $ respect : logi FALSE
 $ rownames: NULL
 $ colnames: NULL
 $ name    : chr "layout"
 $ gp      : NULL
 $ vp      : NULL
 - attr(*, "class")= chr [1:3] "gtable" "grob" "gDesc"

> library(ggplot2)

> str(x, max.level=1)
List of 11
 $ grobs   :List of 11
 $ layout  :'data.frame':       11 obs. of  7 variables:
   $ widths  :Class 'unit'  atomic [1:6] 1.5 6.096 0.762 1.961 0 ...
  .. ..- attr(*, "unit")= chr "mm"
  .. ..- attr(*, "valid.unit")= int 7
 $ heights :Class 'unit'  atomic [1:7] 1.5 2.53 1.52 6.1 6.1 ...
  .. ..- attr(*, "unit")= chr "mm"
  .. ..- attr(*, "valid.unit")= int 7
 $ respect : logi FALSE
 $ rownames: NULL
 $ colnames: NULL
 $ name    : chr "layout"
 $ gp      : NULL
 $ vp      : NULL
 $ NA:Error in object[[i]] : subscript out of bounds

ロードしても、以前のバージョンの でエラーが発生するggplot2ことはありません。xstr

> ls()
character(0)
> load("addgrob.asc.save")
l> ls()
[1] "grobs"  "layout" "x"     
> library(ggplot2)
> str(x, max.level=1)
List of 8
 $ grobs   :List of 8
 $ layout  :'data.frame':       8 obs. of  7 variables:
 $ widths  :Class 'unit'  atomic [1:6] 1.5 6.096 0.762 1.961 0 ...
  .. ..- attr(*, "unit")= chr "mm"
  .. ..- attr(*, "valid.unit")= int 7
 $ heights :Class 'unit'  atomic [1:7] 1.5 2.53 1.52 6.1 6.1 ...
  .. ..- attr(*, "unit")= chr "mm"
  .. ..- attr(*, "valid.unit")= int 7
 $ respect : logi FALSE
 $ rownames: NULL
 $ colnames: NULL
 $ name    : chr "layout"
 - attr(*, "class")= chr [1:3] "gtable" "grob" "gDesc"

traceback() の出力は

> traceback()
2: str.default(x, max.level = 1)
1: str(x, max.level = 1)

補遺: Python では、関数が実行されたときに呼び出されるすべてのコード行がファイルに書き込まれるように設定することができます。Google で検索しましたが、思いついたのはさまざまなデバッグ ユーティリティだけでした。

ADDENDUM2: 問題を作成しました。このため、str 関数が ggplot2 オブジェクトでエラーで失敗します

4

2 に答える 2

2

問題はstr.default、グロブの数として定義されている gtable の長さを調べること[.gtableですが、gtable のセルにアクセスするように記述されているため、それを反復処理して存在しない要素に遭遇することだと思います (セルのマトリックス)、グロブではなく、これらのセルはグロブの数よりも少ない場合があります。

この問題を解決するには、2 つのアプローチを考えることができます。

  1. str.gtableよりコンパクトな情報を提供する方法を定義する(およびこのインデックス作成エラーを修正する)

  2. [.gtable「セルマトリックス」ではなく、グロブのリスト(レイアウトdata.frameの行に相当)にアクセスするために、1つのインデックス(g [1])を再定義します

これが提案されたstr.gtable関数です。それらを定義するための明確なルールがあるのだろうか(デフォルトの方法はかなり野獣です)、

str.gtable <- function(object, ...){
  cat(c("gtable, containing \ngrobs (", 
        length(object[["grobs"]]), "), with names :"), sep="")
  utils::str(names(object[["grobs"]]))
  cat("layout :\n")
  utils::str(object[["layout"]])
  cat("widths :\nunit vector of length", 
      length(object[["widths"]]), "\n")
  cat("heights :\nunit vector of length", 
      length(object[["heights"]]), "\n")
  for(element in c("respect", "rownames", 
                   "name", "gp", "vp")){
    cat(element, ":\n")
    utils::str(object[[element]])
  }
}
library(gridExtra)

g <- tableGrob(head(iris))
str(g)

降伏

gtable, containing 
grobs (84), with names : chr [1:84] "" "" "" "" "" "" "" "" "" "" "" "" ...
layout :
'data.frame':   84 obs. of  7 variables:
 $ t   : int  1 2 3 4 5 6 7 1 2 3 ...
 $ l   : int  1 1 1 1 1 1 1 1 1 1 ...
 $ b   : int  1 2 3 4 5 6 7 1 2 3 ...
 $ r   : int  1 1 1 1 1 1 1 1 1 1 ...
 $ z   : num  1 2 3 4 5 6 7 0 0 0 ...
 $ clip: chr  "on" "on" "on" "on" ...
 $ name: chr  "rowhead-fg" "rowhead-fg" "rowhead-fg" "rowhead-fg" ...
widths :
unit vector of length 6 
heights :
unit vector of length 7 
respect :
 logi FALSE
rownames :
 NULL
name :
 chr "rowhead-fg"
gp :
 NULL
vp :
 NULL
于 2015-07-22T00:53:29.553 に答える