如何以面向对象的方式使用S4方法

时间:2013-06-17 14:15:18

标签: r s4

在高编程语言中,任意类的公共函数可以通过调用该类(对象)的实例来执行,例如, a=new Foo(); a.somePublicFunction();如果我想在R中使用这个编程范例,我会写下面的代码:

 setClass(Class = "Foo",
          representation = representation(a="numeric")
 ) 
 Foo<-function(a=1){new("Foo",a=a)}
 myFunction.Foo<-function(object){
    return(object@a)
 }
 setGeneric("myFunction", function(object) standardGeneric("myFunction"))
 setMethod("myFunction", signature = "Foo", definition = myFunction.Foo)

为什么可以简单地使用myFunction覆盖myFunction<-1/3?如果我打电话给myFunction(obj)obj is an object of class Foo , the interpreter should refer to myFunction.Foo`。如何在R中处理这个问题?

1 个答案:

答案 0 :(得分:1)

通常,类和方法在包中定义。包具有(锁定的)名称空间,其中定义了符号。用户可以重新定义任何符号,但在全局环境中执行此操作;基础符号仍然可访问。在基地R:

> pi
[1] 3.141593
> pi = "apple"
> pi
[1] "apple"
> base::pi
[1] 3.141593

或稍微微妙一点,表明R知道函数与变量

> log(1:5)
[1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379
> log = "pine"
> log
[1] "pine"
> log(1:5)
[1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379

对正在发生的事情的基本理解涉及环境(名称空间是特殊情况),search()路径以及R在环境中的符号与值的关联。符号在环境中必须是唯一的(因此您的myFunction <- 1/3会在全局环境中覆盖先前对myFunction的定义。可以沿着搜索路径动态找到符号(由search()返回,或者以更复杂的方式在包名称空间中查找,然后在基本环境中,然后沿用户可见搜索找到符号)环境)。