由于长度是一个通用的方法,为什么不能做重新定义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函数.. :-)