2009-07-09 41 views

Trả lời

57

Danh sách R có thể được coi là dấu tích của các đối tượng có thể được truy cập theo tên. Sử dụng phương pháp này, bạn có thể thêm một mục mới vào danh sách những thứ tương tự như vậy:

key <- "width" 
value <- 32 

mylist <- list() 
mylist[[ key ]] <- value 

Ở đây chúng ta sử dụng chuỗi được lưu trữ trong khóa biến để truy cập vào một vị trí trong danh sách giống như cách sử dụng các giá trị được lưu trữ trong một biến vòng lặp i để truy cập vào một vector thông qua:

vector[ i ] 

kết quả là:

Danh sách
myList 
$width 
[1] 32 
+2

Cảm ơn! Tôi chưa thực sự hiểu toán tử lập chỉ mục này. Mặc dù nó được giải thích ở đây: http://cran.r-project.org/doc/manuals/R-lang.html#Indexing, việc sử dụng bạn cho thấy không được mô tả. Có tài liệu trực tuyến nào được mô tả đúng không? – Frank

+0

Nếu các giá trị là các loại cơ bản (ví dụ: số duy nhất, ký tự, v.v.), bạn có thể sử dụng một mảng thông thường như: x <- c (1, 4, 2, 5). Sau đó gán tên cho mỗi giá trị chỉ mục như: tên (x) <- c ('a', 'b', 'c', 'd'). Sau đó bạn có thể gọi chúng là x ['a'], x ['b'], v.v. – JAponte

13

yếu tố trong R có thể được đặt tên. Vì vậy, trong trường hợp của bạn chỉ làm

> mylist = list() 
> mylist$width = value 

Khi R gặp mã này

> l$somename=something 

nơi l là một danh sách. Nó gắn vào một danh sách một phần tử gì đó, và đặt tên nó với tên somename. Người ta sau đó có thể được truy cập bằng cách sử dụng

> l[["somename"]] 

hoặc

> l$somename 

Tên có thể được thay đổi với những cái tên lệnh:

> names(l)[names(l)=="somename"] <- "othername" 

Hoặc nếu bạn bây giờ vị trí của nguyên tố trong liệt kê theo:

> names(l)[1] <- "someothername" 
7

Hàm tích hợp setNames() giúp dễ dàng tạo băm từ danh sách khóa và giá trị đã cho. (Nhờ Nick K cho gợi ý tốt hơn.)

Cách sử dụng: hh <- setNames(as.list(values), keys)

Ví dụ:

players <- c("bob", "tom", "tim", "tony", "tiny", "hubert", "herbert") 
rankings <- c(0.2027, 0.2187, 0.0378, 0.3334, 0.0161, 0.0555, 0.1357) 
league <- setNames(as.list(rankings), players) 

Sau đó truy cập vào các giá trị thông qua các phím rất dễ dàng:

league$bob 
[1] 0.2027 
league$hubert 
[1] 0.0555 
+2

'league2 <- setNames (as.list (bảng xếp hạng), người chơi)' nhanh hơn khoảng 4,5 lần và vì nó sử dụng các hàm vectơ hóa, sẽ là một cách 'R' hơn để thực hiện nó. (Demo 'microbenchmark :: microbenchmark (giải đấu <- as.hash (người chơi, bảng xếp hạng), league2 <- setNames (as.list (bảng xếp hạng), người chơi), times = 1000)') –

+0

@NickK: agree, 'setNames' là một giải pháp tốt hơn nhiều! Tôi đã thay thế hàm do người dùng định nghĩa với nó. Chúc mừng! –

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