R中的操作重载

时间:2011-03-16 08:14:28

标签: r string concatenation string-concatenation

为角色重载'+'最直接的方法是什么? 我已定义'%+%' <- function(...) paste(...,sep="")

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

但我不喜欢语法。我认为str <- "aa"+"bb"+"cc"会更好。

(我正在构建用于RODBC的长SQL查询,通常paste在这种情况下不是很方便。有什么建议吗?)

4 个答案:

答案 0 :(得分:9)

您可以尝试这样的事情:

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会话并使你的计算机爆炸: - )

答案 1 :(得分: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:)

答案 2 :(得分:2)

为什么通常的'粘贴'不是很方便?这就是它的意义所在。建议:

给自己写一个不寻常的粘贴功能,可以做你想要的。也许你只是不喜欢一直输入'sep =“”'。所以编写一个用sep =“”调用paste的函数。或者其他什么。

使用字符串连接构建长SQL查询无论如何都可能失败。有关规范示例,请参阅http://xkcd.com/327/

另一种可能性是某种模板解决方案。我过去曾经使用过brew包,它非常棒。

答案 3 :(得分:0)

您可以在stringi包中找到此运算符。

http://docs.rexamine.com/R-man/stringi/oper_plus.html