什么是setReplaceMethod()以及它是如何工作的?

时间:2018-03-06 13:50:55

标签: r s4

我对setReplaceMethod()的使用感到困惑。查看?setReplaceMethod并未提供解释,Google搜索功能也不大。

问题:请解释setReplaceMethod(),它的用法及其工作原理(最好以示例为准)。

2 个答案:

答案 0 :(得分:5)

对于$[names()等提取方法,替换方法,例如$<-,{{1} },或[<-替换将提取的值。

例如,列表:

names<-

因此,对于S4类,example_object <- list(a = 1, b = 2) # the extract method $, when called with arguments example_object and a, # extracts and returns the value 1 example_object$a # [1] 1 # the replace method $<-, when called with arguments example_object, a, and 42, # replaces the value 1 (at example_object$a) with the value 42 example_object$a <- 42 example_object # $a # [1] 42 # # $b # [1] 2 将定义提取方法setMethod("$", ...)的行为,而$或等效setMethod("$<-", ...)将定义替换方法setReplaceMethod("$", ...)的行为。 1}}。 $<-只是为了表达比setReplaceMethod("$")更具表现力,以明确您正在为setMethod("$<-")定义替换方法。

使用S4类的示例:

$

答案 1 :(得分:5)

这是我发现的。正如@Hong Ooi在评论setReplaceMethod("fun")中指出的那样与setMethod("fun<-")相同,因此setReplaceMethod用于在R的S4对象系统中为通用替换函数创建方法。 / p>

what-are-replacement-functions-in-r中解释了什么是替换功能。非常粗鲁,如果你有一个名为fun<-的函数,因为它的名字以<-结尾,你可以写fun(x)<-a而R会读x <- "fun<-"(x,a)

S4对象系统在S4 - Advanced R中描述。

举一个例子,可能更容易开始为S4泛型函数创建一个方法,它不是替换函数:

## Define an S4 class 'Polygon' and an object of this class
setClass("Polygon", representation(sides = "integer"))
p1 <- new("Polygon", sides = 33L)
## Define a generic S4 function 'sides'
sides <- function(object){ NA }
setGeneric("sides")
## sides returns NA
sides( p1 )
## Define a method for 'sides' for the class 'Polygon'
setMethod("sides", signature(object = "Polygon"), function(object) {
  object@sides
})
## Now sides returns the sides of p1
sides( p1 )

为通用替换函数创建方法类似:

## Define a generic replacement function 'sides<-'
"sides<-" <- function(object, value){ object }
setGeneric( "sides<-" )
## The generic 'sides<-' doesn't change the object
sides( p1 ) <- 12L
sides( p1 )
## Define a method for 'sides<-' for the class 'Polygon',
## setting the value of the 'sides' slot
setMethod( "sides<-", signature(object = "Polygon"), function(object, value) {
  object@sides <- value
  object
})
## Now 'sides<-' change the sides of p1
sides( p1 ) <- 12L
sides( p1 )

您还询问了$<-。我猜是这样的:x$name<-value被解释为"$"(x,name)<-value,然后被解释为x <- "$<-"(x,name,value)。请注意,已经定义了泛型函数$<-isGeneric("$<-")),因此我们只为我们的类Polygon定义一个方法:

setMethod( "$<-", signature(x = "Polygon"), function(x, name, value) {
  if( name=="sides" ){
    x@sides <- value
  }
  x
})
## Nothing changes if we try to set 'faces'
p1$faces <- 3L
p1
## but we can set the 'sides'
p1$sides <- 3L
p1

请注意,参数xnamevalue由通用符号决定。