3 回答

TA貢獻1833條經(jīng)驗 獲得超4個贊
正如其他人提到的那樣,您不能覆蓋密封的S4方法“ +”。但是,您無需定義新的類即可為字符串定義加法函數(shù)。這不是理想的選擇,因為它會迫使您轉(zhuǎn)換字符串的類,從而導致代碼更丑陋。而是可以簡單地覆蓋“ +”函數(shù):
"+" = function(x,y) {
if(is.character(x) || is.character(y)) {
return(paste(x , y, sep=""))
} else {
.Primitive("+")(x,y)
}
}
然后,以下所有內(nèi)容均應按預期工作:
1 + 4
1:10 + 4
"Help" + "Me"
該解決方案有點像hack,因為您不再使用形式化方法,而是獲得所需確切行為的唯一方法。

TA貢獻1934條經(jīng)驗 獲得超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到+

TA貢獻1921條經(jīng)驗 獲得超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
- 3 回答
- 0 關(guān)注
- 557 瀏覽
添加回答
舉報