1

在高级编程语言中,可以通过调用此类(对象)的实例来执行任意类的公共函数,例如,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/3myFunction(obj)如果我打电话给obj is an object of classFoo , the interpreter should refer tomyFunction.Foo`。如何在 R 中处理这个问题?

4

1 回答 1

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(),或者以更复杂的方式在包中查找,首先在包名称空间中查找,然后在基础环境中,然后在用户可见的搜索环境中查找)。

于 2013-06-17T14:27:53.817 回答