5

ダイアグラム パッケージ (v 1.6) を使用して、R でフローチャートを再作成しようとしています。この正確なスクリプト (図のドキュメントの例から変更したもの) を使用してグラフを作成できましたが、R を 3.0.0 に更新すると、座標関数でエラーが発生します。次に例を示します。

library(graphics)
library(diagram)

par(mar = c(1, 1, 1, 1))
openplotmat()
elpos<-coordinates(c(1,1,2,4))

Error in (function (classes, fdef, mtable)  : unable to find an inherited method for function ‘coordinates’ for signature ‘"numeric"’

私はまだ R やコードなどに慣れていないので、traceback() を実行すると、それが何を言っているのか本当にわかりません。

3: stop(gettextf("unable to find an inherited method for function %s for signature %s", 
   sQuote(fdef@generic), sQuote(cnames)), domain = NA)
2: (function (classes, fdef, mtable) 
  {
   methods <- .findInheritedMethods(classes, fdef, mtable)
   if (length(methods) == 1L) 
       return(methods[[1L]])
   else if (length(methods) == 0L) {
       cnames <- paste0("\"", sapply(classes, as.character), 
           "\"", collapse = ", ")
       stop(gettextf("unable to find an inherited method for function %s for signature %s", 
           sQuote(fdef@generic), sQuote(cnames)), domain = NA)
   }
   else stop("Internal error in finding inherited methods; didn't return a unique method", 
       domain = NA)
  })(list("numeric"), function (obj, ...) 
  standardGeneric("coordinates"), <environment>)
1: coordinates(c(1, 1, 2, 4))

ほとんどの場合、座標()が更新後に機能しない理由はわかりません。それに関する洞察と、おそらくトレースバックの翻訳は大きな助けになるでしょう。ありがとうございました!

4

1 に答える 1

2

私は問題ほど質問に答えることができません。最初は、エラーを再現できませんでした:

library(diagram)
openplotmat()
(elpos1 <- diagram::coordinates(c(1,1,2,4)))
#       [,1]  [,2]
# [1,] 0.500 0.875
# [2,] 0.500 0.625
# ...

同名関数の検索

ただし、関数の他のインスタンスを探すと、coordinates次のことが明らかになりました。

help.search('coordinates', fields='name')
# Help files with name matching 'coordinates' using fuzzy matching:
# 
# diagram::coordinates                  coordinates of elements on a plot
# sp::coordinates-methods               retrieve (or set) spatial coordinates
# sp::coordinates                       sets spatial coordinates to create spatial data, or retrieves spatial
#                                       coordinates
# sp::coordnames                        retrieve or assign coordinate names for classes in sp

この出力は、インストールされている (ロードされているとは限らない) すべてのパッケージを検索します。このことから、spも持っているようです。ユースケースでそのバージョンを使用すると、エラーが発生します。

パッケージの読み込み順序 (または、マスクされた関数)

後でロードされた関数の関数は、以前にロードされたパッケージの同じ名前の関数をマスクするため、パッケージがロードされる順序は重要です。具体的には:

# ensure we have neither package loaded
detach(package:diagram, unload=TRUE) # ignore errors if not loaded
detach(package:sp, unload=TRUE)      # ignore errors if not loaded
library(diagram)
library(sp)
# Attaching package: 'sp'
# 
# The following object is masked from 'package:diagram':
# 
#     coordinates

このメッセージは、 への単純な呼び出しがからではなく からcoordinates()のバージョンを使用することを示しています。(以下のコード ブロックごとに、上記のように使用して、パッケージもその nameSpace も存在しないことを確認します。)spdiagramdetach()

バージョンを使用するspと、次の順序でライブラリをロードした後に得たのと同じエラーが生成されます: diagramsp:

library(diagram)
library(sp)
# Attaching package: 'sp'
# 
# The following object is masked from 'package:diagram':
# 
#     coordinates
(elpos <- coordinates(c(1,1,2,4)))
# Error in (function (classes, fdef, mtable)  : 
# unable to find an inherited method for function 'coordinates' for signature '"numeric"'

traceback()あなたが提供したものと同じです。

ロード順序を逆にすると、次のようになります。

library(sp)
library(diagram)
# Attaching package: 'diagram'
# 
# The following object is masked from 'package:sp':
# 
#     coordinates
(elpos <- coordinates(c(1,1,2,4)))
#       [,1]  [,2]
# [1,] 0.500 0.875
# [2,] 0.500 0.625
# ...

sp::coordinates()がマスクされていることが警告で示されることに注意してください。

疑わしいときは、明確にする

どのバージョンが呼び出されているかについて疑問がある場合は、使用する予定のバージョンをいつでも強制できます。

(elpos <- diagram::coordinates(c(1,1,2,4)))
#       [,1]  [,2]
# [1,] 0.500 0.875
# [2,] 0.500 0.625
# ...

私はあなたの問題に取り組んでおり、必ずしも記載された質問ではないので、これを回答として投稿するのは少し気が引けます。の結果を探し出す必要がある場合は、引き続き回答を求めてください。ただし、その努力では を見つけることができませんでしたが、 が各行の要素数を指定するベクトル、または要素の位置を含む 2 列の行列、または 'NULL' を期待しているときに理にかなっていますが、 はクラスから派生したオブジェクトを期待しています。 「空間」 (単純なベクトルではないことは間違いありません)。traceback().findInheritedMethods()diagram::coordinatessp::coordinates

于 2014-04-04T18:53:35.077 に答える