2012-02-28 31 views
10

Hãy nói rằng tôi có một vector nơi tôi đã thiết lập một vài thuộc tính:Attributes Duy trì trên Vectors

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

Khi tôi tập hợp con các vector, các thuộc tính được giảm. Ví dụ:

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

Có cách nào để, đặt và duy trì các thuộc tính mà không phải lưu chúng vào một đối tượng tạm thời khác không?

Phần thưởng: Bạn sẽ tìm thấy tài liệu về hành vi này ở đâu?

Trả lời

11

Tôi sẽ viết một phương thức cho [ hoặc subset() (tùy thuộc vào cách bạn đang subsetting) và sắp xếp để giữ lại các thuộc tính. Điều đó sẽ cần một thuộc tính "class" cũng thêm vào vectơ của bạn để công văn diễn ra.

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

Tại thời điểm này, Subsetting loại bỏ thuộc tính:

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

Nếu chúng ta thêm một phương pháp [.foo chúng ta có thể duy trì các thuộc tính:

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

Bây giờ hành vi mong muốn được bảo tồn

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

Và câu trả lời cho câu hỏi bonus:

Từ ?"[" trong phần chi tiết:

Subsetting (trừ bởi một chỉ số có sản phẩm nào) sẽ thả tất cả các thuộc tính ngoại trừ tên, mờ và dimnames.

+0

Thx cho câu trả lời! btw cho danh sách subsetting có thể bao gồm trước khi chuyển các thuộc tính ra ngoài, 'if (! is.null (attrs $ names)) attrs $ names = names (x) [i]' để tập hợp các tên danh sách. Nếu không, nó có thể sẽ gây ra lỗi. –