-1

私はプログラミングRに慣れていません.liw.m​​streeClassという関数を定義し、以下のように定義しましたが、プログラムを実行すると、次のエラーが発生し続けます:

# define method: lcosts(generic dispatch)

liw.mstreeClass <- function(nb, data, method, p) UseMethod("nbcosts"){
Error: unexpected '{' in "liw.mstreeClass <- function(nb, data, method, p) UseMethod("nbcosts"){"

if(method=="penrose") { liw <- mat2listw(penroseDis.mstreeClass((scale(data))))
                       return(liw)}
Error: object 'method' not found
}
Error: unexpected '}' in " }"
4

1 に答える 1

2
# liw.mstreeClass <- function(nb, data, method, p) UseMethod("nbcosts"){
# Error: unexpected '{' in "liw.mstreeClass <- function(nb, data, method, p) 

まず、ここに構文エラーがあります。中括弧を使用して複数の式をグループ化できますが、式の後に中括弧を開始することはできません。

比較...

mean(1)

... と ...

mean(1){
# error!!

次に、S3 では、既存のジェネリック関数のメソッドを定義します。したがって、複数のクラスに適用できる "liw" 関数がある場合、liw.m​​streeClass は、"mstreeClass" というクラスの "liw" を実行する方法を定義します。そのため、最初に liw をジェネリック関数として定義する必要があります。

liw<-function(x,...){
UseMethod("liw")
}

UseMethod の引数として "liw" を指定する必要があることに注意してください。ランダムながらくたではありません。(理由を理解するには、マニュアルを参照してください。) ジェネリック関数の本体で UseMethod の呼び出し以外に多くのコードを使用することはめったにありません。

それができたら、liw の mstreeClass メソッドを定義できます。例えば、

liw.mstreeClass<-function(x, y, z){
   paste("liw equals ", x + y + z)
   }

S3 でのメソッド ディスパッチは最初の引数に基づいているため、x にはクラス "mstreeClass" が必要であることに注意してください。その場合のみ、liw(x) は liw.m​​streeClass(x) に送られます。また、ジェネリックの最初の引数として x がある場合、すべてのメソッドの最初の引数も x と呼ぶ必要があると思います。

UseMethod("nbcosts"){"

if(method=="penrose") { liw <- mat2listw(penroseDis.mstreeClass((scale(data))))
                       return(liw)}
Error: object 'method' not found
}
Error: unexpected '}' in " }"

うーん..申し訳ありませんが、これらの行はあまり意味がありません。UseMethod の使用方法については、上記またはマニュアルを参照してください。

于 2013-09-19T09:49:40.830 に答える