2010-09-01 35 views
2

由於長度是一個通用的方法,爲什麼不能做重新定義length.character

length.character <- nchar 

?似乎字符串在R中被視爲特殊的。有沒有這樣的理由?你會不鼓勵定義像head.character和tail.character這樣的函數嗎?

回答

8

如果你看一下幫助頁面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 
> 
4

我2C:

字符串不R.經過特殊處理的。如果length做了同樣的事情nchar,那麼如果你試圖計算length(c("foo", "bazz")),你會得到意想不到的效果。或者換句話說,你會期望數值向量的length返回向量的每個元素的數字的數量還是向量本身的長度?

此外,創建此方法可能會對期望正常字符串行爲的其他函數產生副作用。

0

現在我找到了一個理由不來定義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函數.. :-)