Nithi
Nithi

Reputation: 1

S4 error: '+' dispatches internally; methods can be defined, but the generic function is implicit, and cannot be changed

But getting this error

Error in setGeneric("+", function(x, y) standardGeneric("+")) : 
  '+' dispatches internally;  methods can be defined, but the generic function is implicit, and cannot be changed.
Execution halted

after running the below code

> setClass("string", representation(
+   data = "character"))
> 
> setGeneric("+", function(x, y) standardGeneric("+"))
setMethod("+", "string", "string", function(x, y) { 
  new("string", data = paste0(x@data, y@data)) })

Upvotes: 0

Views: 65

Answers (2)

Stéphane Laurent
Stéphane Laurent

Reputation: 84529

"+" already exists as a generic so you can't use setGeneric("+" I think (I don't master S4). Here is a way which works:

setClass(
  "string",
  slots = c(data = "character")
)

setMethod(
  "+", 
  signature(e1 = "string", e2 = "string"), 
  function(e1, e2) {
    new("string", data = paste0(e1@data, e2@data))
  }
)

x <- new("string", data = "stack")
y <- new("string", data = "overflow")
x + y

Upvotes: 1

Onyambu
Onyambu

Reputation: 79208

I do not know much of S4 classes, but a quick help page shows that:

setClass("string", representation(data = "character"))
setGeneric("+.string", function(x, y) new("string", data = paste0(x@data, y@data)))

x <- new("string", data = "stack")
y <- new("string", data = "overflow")
x+y

An object of class "string"
Slot "data":
[1] "stackoverflow"

Upvotes: 1

Related Questions