代码之家  ›  专栏  ›  技术社区  ›  Karsten W.

重新定义长度。R中的字符

  •  2
  • Karsten W.  · 技术社区  · 14 年前

    既然长度是一个通用方法,为什么我不能

    length.character <- nchar
    

    ?似乎弦在R中被特殊对待,有什么原因吗?您会不鼓励定义像head.character和tail.character这样的函数吗?

    3 回复  |  直到 14 年前
        1
  •  8
  •   Greg Snow    14 年前

    如果您在帮助页面中查看InternalMethods(在帮助页面的详细信息部分中详细介绍了其长度),它会指出

    为了提高效率,仅限内部调度 发生在 物体 ,那 是指__为的对象。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
    > 
    
        2
  •  4
  •   Jonathan Chang    14 年前

    我的2C:

    字符串不在r.if中特殊处理 length 做了同样的事 nchar ,那么如果您尝试计算 length(c("foo", "bazz")) . 或者换一种说法,你希望 长度 返回每个元素中的位数或向量本身的长度?

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

        3
  •  0
  •   Karsten W.    14 年前

    现在我找到了一个不定义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函数。-)