Поддержание атрибутов по векторам

Скажем, у меня есть вектор, в котором я установил несколько атрибутов:

vec <- sample(50:100,1000, replace=TRUE)
attr(vec, "someattr") <- "Hello World"

Когда я подмножаю вектор, атрибуты отбрасываются. Например:

tmp.vec <- vec[which(vec > 80)]
attributes(tmp.vec) # Now NULL

Есть ли способ, подмножество и сохранение атрибутов, не сохраняя их на другой временный объект?

Бонус: где можно найти документацию по этому поведению?

Ответ 1

Я бы написал метод для [ или subset() (в зависимости от того, как вы выполняете подмножество) и организуйте для этого сохранение атрибутов. Для этого потребуется атрибут "class", который также добавляется к вашему вектору, чтобы произошла отправка.

vec <- 1:10
attr(vec, "someattr") <- "Hello World"
class(vec) <- "foo"

В этот момент подмножество удаляет атрибуты:

> vec[1:5]
[1] 1 2 3 4 5

Если добавить метод [.foo, мы можем сохранить атрибуты:

`[.foo` <- function(x, i, ...) {
    attrs <- attributes(x)
    out <- unclass(x)
    out <- out[i]
    attributes(out) <- attrs
    out
}

Теперь желаемое поведение сохраняется

> vec[1:5]
[1] 1 2 3 4 5
attr(,"someattr")
[1] "Hello World"
attr(,"class")
[1] "foo"

И ответ на вопрос о бонусе:

От ?"[" в разделе сведений:

Подмножество (кроме пустого индекса) приведет к удалению всех атрибутов, кроме имен, тусклых и dimnames.