2012-02-28 6 views
10

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

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

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

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

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

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

ответ

11

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

+0

Thx для ответа! btw для подмножества списков, которые могут быть включены до передачи атрибутов в out, 'if (! is.null (attrs $ names)) attrs $ names = names (x) [i]' также для имен списка подмножеств. В противном случае это приведет к ошибке. –

Смежные вопросы