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.