subset () удаляет атрибуты на векторах; как сохранить / сохранить их? - PullRequest
13 голосов
/ 28 февраля 2012

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

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

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

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

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

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

1 Ответ

14 голосов
/ 28 февраля 2012

Я бы написал метод для [ или 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"

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

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

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

...