2013-07-24 38 views
25

Có cách nào để sử dụng ánh xạ trên hai vectơ để xây dựng danh sách được đặt tên không? Vectơ đầu tiên sẽ là loại character và chứa các tên được sử dụng cho danh sách trong khi thứ hai chứa các giá trị.Tạo danh sách có tên từ hai vectơ (tên, giá trị)

Cho đến nay, giải pháp duy nhất tôi có là:

> dummyList = list() 
> addToList <- function(name, value) { 
+ dummyList[[name]] <- value 
+ } 
> mapply(addToList, c("foo", "bar"), as.list(c(1, 2)) 
$foo 
`1` 

$bar 
`2` 

Điều này có vẻ giống như một giải pháp khá giả tạo, nhưng tôi không thể tìm ra cách để làm điều đó bằng cách khác. Những vấn đề tôi có với nó là:

  1. Nó đòi hỏi sự sáng tạo của dummyList mặc dù dummyList không bao giờ thay đổi và là một danh sách rỗng sau khi cuộc gọi đến mapply.

  2. Nếu vectơ số, c(1, 2), không được chuyển đổi thành danh sách, thì kết quả của cuộc gọi đến mapply là một vector có tên là tăng gấp đôi.

Để khắc phục vấn đề 2, tôi có thể luôn luôn chỉ cần gọi mapply trên hai vectơ và sau đó gọi as.list vào kết quả, nhưng có vẻ như không nên có một cách để trực tiếp tạo ra một danh sách với các giá trị là trong một vector.

Trả lời

46

Bạn có thể sử dụng setNames()

setNames(as.list(c(1,2)), c("foo", "bar")) 

(để có danh sách) hoặc

setNames(c(1,2), c("foo", "bar")) 

(cho một vector)

+2

Cảm ơn bạn. Tôi đã không nhận thức được chức năng 'setNames' và phù hợp với mục tiêu của tôi một cách hoàn hảo. Ngoài sự tò mò, có cách nào để làm điều đó bằng cách sử dụng 'lapply' mà bạn biết không? Có vẻ như có thể là 'lapply' có thể trả về danh sách. –

+0

ý của bạn là "sử dụng' lapply' "là gì? Bạn có muốn thực hiện tác vụ tương tự bằng cách sử dụng 'lapply' không? (Nếu vậy, tại sao? Như một bài tập lập trình? Nhiều bối cảnh sẽ hữu ích.) Nếu bạn muốn làm điều gì đó khác, hãy chỉnh sửa câu hỏi của bạn hoặc hỏi một câu hỏi mới? –

8

tôi chia sẻ sự bối rối của Ben về lý do tại sao bạn có thể muốn làm điều này, và đề nghị của anh ấy.

Chỉ vì sự tò mò của, có một loại tính năng "ẩn" trong mapply mà sẽ cho phép điều này:

x <- letters[1:2] 
y <- 1:2 
mapply(function(x,y) { y }, x, y, SIMPLIFY = FALSE,USE.NAMES = TRUE) 
$a 
[1] 1 

$b 
[1] 2 

Ghi nhận rằng các tài liệu cho USE.NAMES nói:

USE.NAMES logic ; sử dụng tên nếu đối số ... đầu tiên có tên hoặc nếu đó là một vectơ ký tự, hãy sử dụng ký tự đó làm tên.

+1

Tôi không nghĩ đây là một trường hợp sử dụng khó hiểu, chỉ là một trường hợp thoái hóa. Tôi cần phải kết hợp hai mảng đôi với một số cột row.names không được USE.NAMES tự động chọn, vì vậy tôi phải chuyển trong hàng.names (x) theo cách thủ công làm đối số cho hàm không không được sử dụng: 'f = function (n, x, y) {if (y> 0) {-1 * x} else {x}}; r = mapply (f, row.names (x), x, y, SIMPLIFY = F, USE.NAMES = T) '. Một 'data.frame (unlist (r))' đã hoàn thành công việc. Cảm ơn bạn đã chỉ ra tính năng này! –