Создание оператора конкатенации строк в R

Мне было интересно, как можно писать оператор конкатенации строк в R, что-то вроде || в SAS, + в Java / C # или & в Visual Basic.

Самый простой способ – создать специальный оператор, использующий%, например

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

но это приводит к множеству уродливых % в коде.

Я заметил, что + определен в группе Ops, и вы можете написать S4-методы для этой группы, поэтому, возможно, что-то вроде этого будет способом. Однако у меня нет опыта работы с языковыми функциями S4. Как изменить эту функцию для использования S4?

Как уже упоминалось, вы не можете переопределить закрытый метод S4 «+». Однако вам не нужно определять новый class, чтобы определить функцию сложения для строк; это не идеально, поскольку оно заставляет вас преобразовать class строк и, таким образом, привести к более уродливому коду. Вместо этого можно просто перезаписать функцию «+»:

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

Тогда все должны работать, как ожидалось:

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

Это решение кажется немного взломанным, поскольку вы больше не используете формальные методы, но это единственный способ получить точное поведение, которое вы хотели.

Вы также можете использовать classы S3 для этого:

 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 

Я попробую это (относительно более чистое решение S3)

 `+` <- 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') 

Код выше изменит + на общий и установит +.default в исходное + , а затем добавит новый метод +.character в +

Если R будет точно соответствовать S4, было бы достаточно:

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

Но это дает ошибку, что метод запечатан: ((Надеюсь, это изменится в версиях функций R.

Лучшее, что вы можете сделать, это определить новый class «string», который будет вести себя как class «character»:

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

и определите наиболее общий метод, который позволяет R:

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

теперь попробуйте:

 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" 

Вы дали правильный ответ – все в R является функцией, и вы не можете определить новых операторов. Таким образом, %+% так же хорошо, как и получается.

  • Объединить строки по конкретным столбцам данных
  • Конкатенация строк без оператора «+»
  • Как конкатенировать значения int в java?
  • Interesting Posts

    Как хранить изображения в вашей файловой системе

    Могу ли я подключить ПК к коммутатору PoE?

    Подробное руководство по использованию gcov с CMake / CDash?

    Как дождаться завершения всех streamов, используя ExecutorService?

    Как получить текстовый узел элемента?

    Как запустить Windows Check Disk без запроса?

    Как убить процесс, который в настоящее время использует порт на localhost в Windows?

    Android Запись журналов в текстовый файл

    Действие параметра , в котором T3 может быть необязательным

    Будет ли этот автомобильный адаптер питания этого ноутбука?

    Беспроводная сеть медленнее, чем ожидалось

    Мой приятельский список в Excel ушел

    Отключить предупреждение «Эти файлы могут быть вредны для вашего компьютера»?

    Почему браузер файлов не просматривается в текущей папке в Windows7?

    Использование Java для расшифровки openssl aes-256-cbc с использованием предоставленного ключа и iv

    Давайте будем гением компьютера.