为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

宝慕林4294392 2019-10-30 10:45:18
我想知道如何在R中编写字符串连接运算符,例如||。在SAS,+在Java / C#或&在Visual Basic中。最简单的方法是使用%创建特殊运算符,例如`%+%` <- function(a, b) paste(a, b, sep="")但这会导致%代码中很多难看的东西。我注意到,这+是在Ops组中定义的,您可以为该组编写S4方法,所以也许可以采用类似的方法。但是,我完全没有使用S4语言功能的经验。我如何修改上述功能以使用S4?
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

正如其他人提到的那样,您不能覆盖密封的S4方法“ +”。但是,您无需定义新的类即可为字符串定义加法函数。这不是理想的选择,因为它会迫使您转换字符串的类,从而导致代码更丑陋。而是可以简单地覆盖“ +”函数:


"+" = 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"

该解决方案有点像hack,因为您不再使用形式化方法,而是获得所需确切行为的唯一方法。


查看完整回答
反对 回复 2019-10-30
?
撒科打诨

TA贡献1934条经验 获得超2个赞

我会尝试的(相对更干净的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到+


查看完整回答
反对 回复 2019-10-30
?
郎朗坤

TA贡献1921条经验 获得超9个赞

您也可以为此使用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


查看完整回答
反对 回复 2019-10-30
  • 3 回答
  • 0 关注
  • 514 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信