-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")
}

请注意,您必须将“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 的手册。

于 2013-09-19T09:49:40.830 回答