由于长度是一般方法,为什么我不能
length.character <- nchar
?似乎字符串在R中被特殊处理。这是有原因的吗?你会不鼓励定义head.character和tail.character等函数吗?
答案 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中不会特别处理字符串。如果length
与nchar
做同样的事情,那么如果您尝试计算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函数..: - )