2010-09-01 58 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函数.. :-)