我试图覆盖像+
或-
这样的二元运算符,它们接收两个整数或两个数字而不设置类属性。
首先,我尝试了setMethod
。但它没有重新定义密封运算符
其次,我试着像this link那样写Ops.{class}
但是如果没有将类设置为S3对象,它就无法工作。
所以,我想知道如何覆盖+
和-
方法,这些方法在没有类属性的情况下采用整数或数字。
答案 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