2012-05-18 34 views
9

Câu hỏi nhanh. Tại sao các công việc sau trong R (gán một cách chính xác giá trị biến "Xin chào" với phần tử đầu tiên của vector):Trong R, không thể đặt tên của các phần tử vectơ sử dụng phép gán trong hàm kết hợp

> a <- "Hello" 
> b <- c(a, "There") 
> b 
[1] "Hello" "There" 

Và công trình này:

> c <- c("Hello"=1, "There"=2) 
> c 
Hello There 
    1  2 

Nhưng điều này không (làm cho vector tên phần tử bằng "a" chứ không phải là "Hello"):

> c <- c(a=1, "There"=2) 
> c 
    a There 
    1  2 

có thể làm cho R nhận ra rằng tôi muốn sử dụng giá trị của một trong những tuyên bố c <- c(a=1, "There"=2)?

+2

Một sang một bên: Ack! Bạn đang che giấu hàm 'c()' với một biến! Nguy hiểm! Nguy hiểm, Will Robinson! – joran

+0

Rất tiếc. Vì vậy, tôi không nên đặt tên biến 'c'? Tôi đã dự tính chỉnh sửa câu hỏi của mình, nhưng tôi sẽ để nó cho mục đích giáo dục. –

+0

Nó không phải là thảm họa, nhưng nói chung bạn nên tránh các chức năng phổ biến như biến. 'c()', 'data()' và 't()' là những cái phổ biến nhất mà mọi người cố gắng sử dụng. – joran

Trả lời

8

Tôi không chắc chắn cách thức c() tạo nội bộ thuộc tính tên từ các đối tượng được đặt tên. Có lẽ nó nằm dọc theo các dòng list()unlist()? Dù sao, bạn có thể gán giá trị của véc tơ đầu tiên, và thuộc tính tên sau, như sau.

a <- "Hello" 
b <- c(1, 2) 
names(b) = c(a, "There") 
b 
# Hello There 
#  1  2 

Sau đó, để truy cập vào các phần tử có tên sau:

b[a] <- 3 
b 
# Hello There 
#  3  2 
b["Hello"] <- 4 
b 
# Hello There 
#  4  2 
b[1] <- 5 
b 
# Hello There 
#  5  2 

Sửa

Nếu bạn thực sự muốn làm tất cả trong một dòng, các công việc sau:

eval(parse(text = paste0("c(",a," = 1, 'there' = 2)"))) 
# Hello there 
# 1  2 

Tuy nhiên, tôi nghĩ bạn sẽ thích gán giá trị và tên theo cách tiếp cận eval(parse()).

0

Gán các giá trị trong danh sách được đặt tên. Sau đó, không công khai. ví dụ.

lR < -list ("a" = 1, "Có" = 2)

v = ngừng công bố (lR)

này đưa ra một tên vector v

v

a There 
1  2 
Các vấn đề liên quan