【发布时间】:2011-04-06 22:53:11
【问题描述】:
既然length是一个泛型方法,为什么我不能这样做
length.character <- nchar
?似乎字符串在 R 中被特殊对待。这是有原因的吗?你会反对定义像 head.character 和 tail.character 这样的函数吗?
【问题讨论】:
既然length是一个泛型方法,为什么我不能这样做
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 的工作方式。例如:
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 函数.. :-)
【讨论】: