在R语言中的操作符重载

5

如何最直接地为字符重载'+'运算符?我已经定义了'%+%' <- function(...) paste(...,sep="")

str <- "aa"%+%"bb"%+%"cc" #str="aabbcc"

但我不喜欢这种语法。我认为 str <- "aa"+"bb"+"cc" 更好看一些。

(我正在构建长的SQL查询以与RODBC一起使用,通常的paste在这种情况下不太方便。有什么建议吗?)


R不支持运算符重载吗? - David Heffernan
2
@David Heffernan,它确实可以。但是不允许重新定义某些对象(函数、运算符、常量)。在stackoverflow上检查另一个相关问题 - Marek
4个回答

11
你可以尝试这样做:
R> oldplus <- `+`
R> `+` <- function(e1, e2) { 
R>     if (is.character(e1) && is.character(e2)) { 
R>          paste(e1,e2,sep="") 
R>      }
R>      else { 
R>          oldplus(e1,e2) 
R>      } 
R>  }

这会给出:

R> 2+3
[1] 5
R> "aa"+"bb"
[1] "aabb"

但是正如Sacha所指出的那样,重载这样一个基本函数非常危险,我无法保证它不会破坏您的R会话并使您的计算机爆炸:-)


应该没问题,但你必须记得 rm() 掉被重载的函数。他/她已经被警告了。 :) - Roman Luštrik

5
我认为使用两个参数比使用省略号更好:
'%+%' <- function(x,y) paste(x,y,sep="")

"a"%+%"b"%+%"C"
[1] "abC"

如果你真的非常想要,可以覆盖掉+,但是在这样做时一定要非常小心,因为你会破坏R中最重要的函数之一。我想不出为什么你会选择这样做而不是使用%+%
# '+' <- function(x,y) paste(x,y,sep="")
# "a"+"b"+"C"
# [1] "abC"

rm('+')

我将其注释掉以确保我不会意外破坏某人的R :)


1
正确的方法是在特定类上定义运算符,例如+.SQL,然后将向量定义为具有该类。这样你就不会破坏其他人的函数。请参见https://dev59.com/k2445IYBdhLWcg3ws8dq#4731547。 - adamleerich
如果您关心安全问题,限制字符串类的过载不是更好的选择吗?例如 '+'.string <- function( - JonnyRobbie

2

为什么通常的“粘贴”功能不太方便?它就是为此而设计的。建议如下:

编写一个自定义的粘贴函数,以实现您想要的功能。也许您只是不喜欢一直输入“sep =””。因此,编写一个调用带有sep = ""的paste函数的函数,或其他类似的操作。

使用字符串拼接构建长SQL查询可能会导致潜在的失败。请参见http://xkcd.com/327/,其中有一个经典的例子。

另一种可能性是使用某种模板解决方案。我过去曾使用过brew软件包,非常适合这种情况。


4
那就编写一个调用paste函数且sep=""的函数。但这正是paste0()的作用! - Gaffi

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接