2012-02-28 14 views
10

powiedzmy mam wektor gdzie mam ustawić kilka atrybutów:Utrzymanie Atrybuty na wektorach

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

Kiedy podzbiór wektor, atrybuty są odrzucane. Na przykład:

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

Czy istnieje sposób, podzestaw i trwałość atrybutów bez konieczności zapisywania ich w innym obiekcie tymczasowym?

Bonus: Gdzie można znaleźć dokumentację dotyczącą tego zachowania?

Odpowiedz

11

Napisałbym metodę dla [ lub subset() (zależnie od tego, w jaki sposób tworzysz podzbiory) i ustawiłeś dla zachowania atrybutów. To by wymagało atrybutu "class" również dodając do twojego wektora, aby nastąpiła wysyłka.

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

W tym momencie podzbiorów usuwa atrybuty:

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

Jeśli dodamy metodę [.foo możemy zachować atrybuty:

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

Teraz pożądane zachowanie jest zachowana

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

A odpowiedź na pytanie bonus:

Od ?"[" w sekcji szczegółów:

podzbioru (z wyjątkiem pustego indeksu) spadnie wszystkie atrybuty z wyjątkiem nazwy, słabe i dimnames.

+0

Thx za odpowiedź! btw dla zestawienia podzbiorów jeden może zawierać przed przeniesieniem atrybutów na zewnątrz, 'if (! is.null (attrs $ names)) attrs $ names = names (x) [i]' na nazwy podzestawów list również. W przeciwnym razie prawdopodobnie spowoduje błąd. –

Powiązane problemy