3 回答
TA贡献1790条经验 获得超9个赞
正如其他人提到的那样,您不能覆盖密封的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,因为您不再使用形式化方法,而是获得所需确切行为的唯一方法。
TA贡献1812条经验 获得超5个赞
我会尝试的(相对更干净的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到+
TA贡献1783条经验 获得超4个赞
您也可以为此使用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
- 3 回答
- 0 关注
- 746 浏览
添加回答
举报