String 在R中重新定义length.character

String 在R中重新定义length.character,string,r,String,R,既然长度是一种通用方法,为什么我不能这样做呢 length.character <- nchar length.characterMy 2c: 字符串在R中没有特殊处理。如果length做了与nchar相同的事情,那么如果您尝试计算长度(c(“foo”,“bazz”),则会得到意外的结果。或者换一种方式,您希望数值向量的长度返回向量每个元素的位数还是向量本身的长度 另外,创建此方法可能会对其他预期正常字符串行为的函数产生副作用。如果查看帮助页面中的InternalMethods(在帮助页

既然长度是一种通用方法,为什么我不能这样做呢

length.character <- nchar
length.characterMy 2c:

字符串在R中没有特殊处理。如果
length
做了与
nchar
相同的事情,那么如果您尝试计算
长度(c(“foo”,“bazz”)
,则会得到意外的结果。或者换一种方式,您希望数值向量的
长度
返回向量每个元素的位数还是向量本身的长度


另外,创建此方法可能会对其他预期正常字符串行为的函数产生副作用。

如果查看帮助页面中的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
> 
>tmp class(tmp)length.mynewclass 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
> 

现在我找到了一个不定义head.character的理由:它改变了head的工作方式。例如:

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.character