переопределить length.character в R - PullRequest
2 голосов
/ 01 сентября 2010

Поскольку длина - это общий метод, почему я не могу сделать

length.character <- nchar

?Кажется, что строки обрабатываются специально в R. Есть ли причина для этого?Не хотите ли определять такие функции, как head.character и tail.character?

Ответы [ 3 ]

8 голосов
/ 01 сентября 2010

Если вы посмотрите на страницу справки для 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
> 
4 голосов
/ 01 сентября 2010

Мой 2с:

Строки не обрабатываются специально в R. Если length сделал то же самое, что и nchar, то вы получите неожиданные результаты, если попытаетесь вычислить length(c("foo", "bazz")). Или, другими словами, можно ли ожидать, что length числового вектора вернет количество цифр в каждом элементе вектора или длину самого вектора?

Также создание этого метода может привести к побочным эффектам других функций, которые ожидают нормального поведения строки.

0 голосов
/ 03 сентября 2010

Теперь я нашел причину не определять 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").

Но теперь у меня есть strhead и функция strtail ..: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...