重新定义R中的length.character

时间:2010-09-01 17:52:29

标签: string r

由于长度是一般方法,为什么我不能

length.character <- nchar

?似乎字符串在R中被特殊处理。这是有原因的吗?你会不鼓励定义head.character和tail.character等函数吗?

3 个答案:

答案 0 :(得分: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
> 

答案 1 :(得分:4)

我的2c:

在R中不会特别处理字符串。如果lengthnchar做同样的事情,那么如果您尝试计算length(c("foo", "bazz")),则会出现意外结果。换句话说,你希望数字向量的length能够返回向量的每个元素中的位数或向量本身的长度吗?

同样创建此方法可能会影响其他期望正常字符串行为的函数。

答案 2 :(得分: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”)。

但我现在有一个str和一个strtail函数..: - )