由於長度是一個通用的方法,爲什麼不能做重新定義length.character
length.character <- nchar
?似乎字符串在R中被視爲特殊的。有沒有這樣的理由?你會不鼓勵定義像head.character和tail.character這樣的函數嗎?
由於長度是一個通用的方法,爲什麼不能做重新定義length.character
length.character <- nchar
?似乎字符串在R中被視爲特殊的。有沒有這樣的理由?你會不鼓勵定義像head.character和tail.character這樣的函數嗎?
如果你看一下幫助頁面InternalMethods(在長度上的幫助頁面的細節部分提到的)它指出
爲了提高效率,內部分派只有 發生在對象,即 是'is.object'返回true的那些。
向量不是與其他對象具有相同意義的對象,所以方法調度不在任何基本向量(不僅僅是字符)上完成。如果你真的想使用這種類型的調度,你需要一個定義的對象,例如:
> tmp <- state.name
> class(tmp) <- 'mynewclass'
> length.mynewclass <- nchar
> length(tmp)
[1] 7 6 7 8 10 8 11 8 7 7 6 5 8 7 4 6 8 9 5 8 13 8 9 11 8
[26] 7 8 6 13 10 10 8 14 12 4 8 6 12 12 14 12 9 5 4 7 8 10 13 9 7
>
我2C:
字符串不R.經過特殊處理的。如果length
做了同樣的事情nchar
,那麼如果你試圖計算length(c("foo", "bazz"))
,你會得到意想不到的效果。或者換句話說,你會期望數值向量的length
返回向量的每個元素的數字的數量還是向量本身的長度?
此外,創建此方法可能會對期望正常字符串行爲的其他函數產生副作用。
現在我找到了一個理由不來定義head.character:它改變頭是如何運作的方式。例如:
head.character <- function(s,n) if(n<0) substr(s,1,nchar(s)+n) else substr(s,1,n)
test <- c("abc", "bcd", "cde")
head("abc", 2) # works fine
head(test,2)
沒有head的定義,最後一行會返回c(「abc」,「bcd」)。現在,在定義了head.character的情況下,該函數應用於列表的每個元素並返回c(「ab」,「bc」,「cd」)。
但是我現在有一個strhead和一個strtail函數.. :-)