Fazendo um operador de concatenação de string em R

Eu queria saber como se poderia escrever um operador de concatenação de strings em R, algo como || no SAS, + em Java / C # ou & no Visual Basic.

A maneira mais fácil seria criar um operador especial usando%, como

`%+%` <- function(a, b) paste(a, b, sep="") 

mas isso leva a muitos % feios no código.

Eu notei que + é definido no grupo Ops, e você pode escrever methods S4 para esse grupo, então talvez algo assim seria o caminho a percorrer. No entanto, não tenho nenhuma experiência com os resources da linguagem S4. Como eu modificaria a function acima para usar o S4?

Como outros já mencionaram, você não pode sobrescrever o método S4 “+”. No entanto, você não precisa definir uma nova class para definir uma function de adição para seqüências de caracteres; isso não é ideal, pois força você a converter a class de strings e, assim, levar a um código mais feio. Em vez disso, pode-se simplesmente sobrescrever a function “+”:

 "+" = function(x,y) { if(is.character(x) || is.character(y)) { return(paste(x , y, sep="")) } else { .Primitive("+")(x,y) } } 

Então, o seguinte deve funcionar como esperado:

 1 + 4 1:10 + 4 "Help" + "Me" 

Esta solução parece um pouco como um hack, já que você não está mais usando methods formais, mas é a única maneira de obter o comportamento exato que você queria.

Você também pode usar classs S3 para isso:

 String <- function(x) { class(x) <- c("String", class(x)) x } "+.String" <- function(x,...) { x <- paste(x, paste(..., sep="", collapse=""), sep="", collapse="") String(x) } print.String <- function(x, ...) cat(x) x <- "The quick brown " y <- "fox jumped over " z <- "the lazy dog" String(x) + y + z 

Vou tentar isso (solução S3 relativamente mais limpa)

 `+` <- function (e1, e2) UseMethod("+") `+.default` <- function (e1, e2) .Primitive("+")(e1, e2) `+.character` <- function(e1, e2) if(length(e1) == length(e2)) { paste(e1, e2, sep = '') } else stop('String Vectors of Different Lengths') 

O código acima irá mudar + para um genérico e definir o +.default para o + original, depois adicionar novo método +.character para +

Se R cumprisse rigorosamente o S4, o seguinte seria suficiente:

 setMethod("+", signature(e1 = "character", e2 = "character"), function (e1, e2) { paste(e1, e2, sep = "") }) 

Mas isso dá um erro que o método é selado: ((. Espero que isso vai mudar nas versões de recurso de R.

O melhor que você pode fazer é definir uma nova class “string” que se comportaria exatamente como “character” class:

 setClass("string", contains="character") string <- function(obj) new("string", as.character(obj)) 

e definir o método mais geral que R permite:

 setMethod("+", signature(e1 = "character", e2 = "ANY"), function (e1, e2) string(paste(e1, as.character(e2), sep = ""))) 

agora tente:

 tt <- string(44444) tt #An object of class "string" #[1] "44444" tt + 3434 #[1] "444443434" "sfds" + tt #[1] "sfds44444" tt + tt #[1] "4444444444" 343 + tt #Error in 343 + tt : non-numeric argument to binary operator "sdfs" + tt + "dfsd" #An object of class "string" #[1] "sdfs44444dfsd" 

Você se deu a resposta correta – tudo em R é uma function e você não pode definir novos operadores. Então %+% é tão bom quanto possível.