使用UseMethod定义S3函数

时间:2013-09-18 15:28:49

标签: r

我是编程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 " }"

1 个答案:

答案 0 :(得分: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")
}

请注意,您必须将“liw”作为UseMethod的参数,而不是一些随机垃圾。 (看看手册以了解原因。)除了在泛型函数体中调用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的手册。