如何覆盖整数或数字类型的二元运算符?

时间:2015-07-29 09:07:22

标签: r

我试图覆盖像+-这样的二元运算符,它们接收两个整数或两个数字而不设置类属性。

首先,我尝试了setMethod。但它没有重新定义密封运算符

其次,我试着像this link那样写Ops.{class} 但是如果没有将类设置为S3对象,它就无法工作。

所以,我想知道如何覆盖+-方法,这些方法在没有类属性的情况下采用整数或数字。

1 个答案:

答案 0 :(得分:1)

如果您只想覆盖+-数字,那么您可以这样做。这是一个例子:

`+` <- function(x,y) x * y
 2 + 3
 [1] 6

当然,在您完成此操作后,您无法再以正常方式使用+(但出于我之外的原因,似乎这就是您想要的)。

如果你需要一些特殊的数字算法,那么使用%<operator>%表示法更容易定义中缀运算符。以下是定义max-plus algebra

操作的示例
`%+%` <- function(x,y) pmax(x,y) #(use pmax for vectorization)
`%*%` <- function(x,y) x + y
 2 %+% 3
 [1] 3
 2 %*% 3
 [1] 5

另一种选择是定义一个特殊的数字类。 (我在下面的示例中将其称为tropical,因为max-plus代数是tropical algebra的变体

setClass("tropical",slots = c(x="numeric"))

# a show method always comes in handy
setMethod("show","tropical",function(object){ 
  cat("tropical vector\n")
    print(object@x)
})

# its also nice to have an extractor
setMethod("[","tropical",function(x,i,j,...,drop) new("tropical",x=x@x[i]) )

setMethod("+",c("tropical","tropical")
  , function(e1,e2) new("tropical", x=pmax(e1@x,e2@x)) 
setMethod("*",c("tropical","tropical")
  , function(e1,e2) new("tropical", x= e1@x + e2@x))


# try it out

tr1 <- new("tropical",x=c(1,2,3))
tr2 <- new("tropical",x=c(3,2,1))


tr1 + tr2
tr1 * tr2
# this gives a warning about recycling
tr1[1:2] + tr2