3 回答

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

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
我會(huì)嘗試的(相對(duì)更干凈的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')
上面的代碼將更改為+通用代碼,并將設(shè)置+.default為原始代碼+,然后將新方法添加+.character到+

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
您也可以為此使用S3類(lèi):
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)注
- 786 瀏覽
添加回答
舉報(bào)