在R中制作字符串连接运算符

我想知道如何在R中编写字符串连接运算符,例如||。在SAS,+在Java / C#或&在Visual Basic中。


最简单的方法是使用%创建特殊运算符,例如


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

但这会导致%代码中很多难看的东西。


我注意到,这+是在Ops组中定义的,您可以为该组编写S4方法,所以也许可以采用类似的方法。但是,我完全没有使用S4语言功能的经验。我如何修改上述功能以使用S4?


宝慕林4294392
浏览 480回答 3
3回答

潇潇雨雨

正如其他人提到的那样,您不能覆盖密封的S4方法“ +”。但是,您无需定义新的类即可为字符串定义加法函数。这不是理想的选择,因为它会迫使您转换字符串的类,从而导致代码更丑陋。而是可以简单地覆盖“ +”函数:"+" = function(x,y) {&nbsp; &nbsp; if(is.character(x) || is.character(y)) {&nbsp; &nbsp; &nbsp; &nbsp; return(paste(x , y, sep=""))&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; .Primitive("+")(x,y)&nbsp; &nbsp; }}然后,以下所有内容均应按预期工作:1 + 41:10 + 4&nbsp;"Help" + "Me"该解决方案有点像hack,因为您不再使用形式化方法,而是获得所需确切行为的唯一方法。

撒科打诨

我会尝试的(相对更干净的S3解决方案)`+` <- function (e1, e2) UseMethod("+")`+.default` <- function (e1, e2) .Primitive("+")(e1, e2)`+.character` <- function(e1, e2)&nbsp;&nbsp; &nbsp; if(length(e1) == length(e2)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;paste(e1, e2, sep = '')&nbsp; &nbsp; } else stop('String Vectors of Different Lengths')上面的代码将更改为+通用代码,并将设置+.default为原始代码+,然后将新方法添加+.character到+

郎朗坤

您也可以为此使用S3类:String <- function(x) {&nbsp; class(x) <- c("String", class(x))&nbsp; x}"+.String" <- function(x,...) {&nbsp; x <- paste(x, paste(..., sep="", collapse=""), sep="", collapse="")&nbsp; String(x)}print.String <- function(x, ...) cat(x)x <- "The quick brown "y <- "fox jumped over "z <- "the lazy dog"String(x) + y + z
打开App,查看更多内容
随时随地看视频慕课网APP