在高编程语言中,任意类的公共函数可以通过调用该类(对象)的实例来执行,例如, 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中处理这个问题?
答案 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()
返回,或者以更复杂的方式在包名称空间中查找,然后在基本环境中,然后沿用户可见搜索找到符号)环境)。