在R的OOP中object和.Object有什么区别?

xxb16uws  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(171)

我正在学习S4的类和方法,我搞不清楚什么时候使用.Object和object(用作类上函数的参数)。我不明白它们之间有什么区别。
例如,Would be correct:

setGeneric("getTimes",function(object){standardGeneric ("getTimes")})
setMethod("getTimes","Trajectories",
          function(object){
            return(object@times)
            }
          )

或:

setGeneric("getTimes",function(.Object){standardGeneric ("getTimes")})
setMethod("getTimes","Trajectories",
          function(.Object){
            return(.Object@times)
            }
          )
kuuvgm7e

kuuvgm7e1#

首先,应该避免使用{standardGeneric("getTimes")}周围的花括号。
您问题的简短答案:示例中的两段代码没有区别。您将getTimes定义为自己的一个全新泛型函数。您可以指定其参数名称,无论您喜欢什么(objectxxobject.Object)。然后,当您编写泛型函数的方法时,方法的参数名必须与泛型函数的参数名匹配。例如:

setGeneric("getTimes", function(object) standardGeneric("getTimes"))
setMethod("getTimes", "Trajectories", function(object) object@times)

如果不遵循,就会出现错误(从技术上讲,这是一个警告,因为R会自动/"静默"地纠正它。但是,在我看来,在这种情况下,R应该停止并抛出一个错误):

setGeneric("getTimes", function(object) standardGeneric("getTimes"))
setMethod("getTimes", "Trajectories", function(x) x@times)
# mismatch between `x` argument name in method and `object` argument name in generic

如果你想为现有的泛型定义方法,你应该使用函数method.skeleton
例一:

setGeneric("getTimes", function(xobject) standardGeneric("getTimes")) # generic function is defined
getTimes # type function name without parentheses to get a summary of the generic
method.skeleton("getTimes", "Trajectories", stdout())
# copy this method skeleton to your script/source file and modify to your need

例2,show是一个预定义的泛型,用object作为参数(见?show),或者你可以输入show而不用括号来检查。因此,setMethod("show", "Trajectories", function(.Object) .Object)将是错误的。你可以继续使用这种方法,但是,我认为method.skeleton是一个非常有用的选择:

> method.skeleton("show", "Trajectories", stdout())
setMethod("show",
    signature(object = "Trajectories"),
    function (object) 
    {
        stop("need a definition for the method here")
    }
)

示例3,initialize是通用函数,并且可以定义其自变量.Object(输入initialize,不带括号)。据我理解,在本例中选择.Object作为参数名的原因是为了唤起原型对象的感觉(你可以在?initialize上阅读更多)类似于示例2,使用method.skeleton helper函数:

> method.skeleton("initialize", "Trajectories", stdout())
setMethod("initialize",
    signature(.Object = "Trajectories"),
    function (.Object, ...) 
    {
        stop("need a definition for the method here")
    }
)
    • 注意**:替换/赋值函数(<-)有一个特殊情况,即它的最后一个参数必须命名为value。阅读更多信息。例如:
setClass("Trajectories", slots = c(times = "numeric"))

setGeneric("getTimes", function(x) standardGeneric("getTimes"))
setMethod("getTimes","Trajectories", function(x) x@times)

setGeneric("getTimes<-", function(xobject, value) standardGeneric("getTimes<-"))
setMethod("getTimes<-", c("Trajectories", "ANY"), function(xobject, value) {
    xobject@times <- value
    xobject
})

# test drive
m <- new("Trajectories", times = 32)
getTimes(m)
getTimes(m) <- 42
getTimes(m)

如果在定义泛型和伴随方法时使用其他名称(下面的new_value),R将不会输出任何错误或警告。但是,当您使用它时,R将错误:

setGeneric("getTimes<-", function(xobject, new_value) standardGeneric("getTimes<-"))
setMethod("getTimes<-", c("Trajectories", "ANY"), function(xobject, new_value) {
    xobject@times <- new_value
    xobject
})

# test drive
m <- new("Trajectories", times = 32)
getTimes(m)
getTimes(m) <- 42 # error because the right side of <- is always considered as `value` argument

相关问题