2015-09-24 14 views
11

tôi đã nhận thấy tính năng bất ngờ này:R danh sách - các tên phần tử được xử lý như thế nào?

foo <- list(whatever=1:10) 

Bây giờ, các công trình sau đây cũng như:

foo$wha 
foo$w 
foo$whateve 

Tuy nhiên, sau đây không:

foo[["wha"]] 

này có những hậu quả bất ngờ (bất ngờ cho tôi, nghĩa là) nếu bạn có hai tên tiềm năng, như "CXCL1" và "CXCL11" và bạn muốn k bây giờ cho dù CXCL1 không phải là null bằng cách kiểm tra !is.null(foo$CXCL1), nó sẽ trả về TRUE ngay cả khi CXCL1 null, nhưng CXCL11 thì không.

Câu hỏi của tôi là:

  1. Làm thế nào mà làm việc?
  2. Sự khác biệt giữa foo$whateverfoo[["whatever"]] là gì?
  3. Tại sao mọi người lại muốn hành vi này và làm cách nào để vô hiệu hóa hành vi này?
+6

[Đây là câu trả lời của tôi cho một câu hỏi tương tự] (http://stackoverflow.com/questions/11066464/you-can-abbreviate-list-names-why/11066583#11066583) –

+6

'help (" [[") 'có giá trị lớn ở đây (nó thảo luận về 'kết hợp từng phần' bạn đang gặp phải). Bạn nên xem xét 'foo [[" "thing", exact = TRUE]] 'nếu bạn cần độ chính xác trong kết hợp (đó là mặc định cho' [['mặc dù). Bạn cũng có thể đặt 'options (warnPartialMatchDollar = TRUE)' để nhận cảnh báo. – hrbrmstr

+1

Bạn có thể tránh sự cố trong trường hợp của mình ít nhất bằng cách điền vào danh sách với tất cả các tên tiềm năng và đặt chúng, ví dụ: 'CXCL1 = NULL' –

Trả lời

1
  1. Kết hợp từng phần chỉ hoạt động với các chuỗi danh sách ban đầu duy nhất. Vì vậy, ví dụ:

    > l <- list(score=1, scotch=2) 
    > l$core #only INITIAL subsequences 
    NULL 
    > l$sco #only UNIQUE subsequences 
    NULL 
    > l$scor 
    [1] 1 
    
  2. Cả [[$ chọn một yếu tố duy nhất của danh sách. Sự khác biệt chính là $ không cho phép chỉ mục được tính toán, trong khi [[ thực hiện và khớp một phần được phép theo mặc định với toán tử $ nhưng không cho phép với [[.

  3. Các số này Trích xuất hoặc thay thế toán tử đến từ S, mặc dù R hạn chế sử dụng khớp một phần, trong khi S sử dụng khớp một phần trong hầu hết các toán tử theo mặc định.

Trong ví dụ của bạn, nếu CXCL1CXCL11 cùng tồn tại và bạn chỉ số foo$CXCL1, đó không phải là một trận đấu một phần và sẽ trả về giá trị CXCL1 's. Nếu không, có thể có một vấn đề khác.

Tôi nên chỉ ra, [[ không cho phép khớp một phần như mặc định bắt đầu từ phiên bản R 2.7.0 trở đi.

Các vấn đề liên quan