2014-04-25 10 views
36

Đây là mã của tôi:

x<-c(1,2) 
x 
names(x)<- c("bob","ed") 
x$ed 

Tại sao tôi nhận được lỗi:

Error in x$ed : $ operator is invalid for atomic vectors 

Trả lời

51

Từ các tập tin trợ giúp về $ (Xem ?"$"), bạn có thể đọc:

$ is only valid for recursive objects, and is only discussed in the section below on recursive objects.

Bây giờ, hãy kiểm tra xem x là rec ursive

> is.recursive(x) 
[1] FALSE 

Một đối tượng đệ quy có một cấu trúc danh sách giống như. Một vector không đệ quy, nó là một đối tượng nguyên tử thay vào đó, hãy kiểm tra

> is.atomic(x) 
[1] TRUE 

Vì vậy, bạn nhận được một lỗi khi áp dụng $ để một vector (không đệ quy đối tượng), sử dụng [ thay vì:

> x["ed"] 
ed 
2 

Bạn cũng có thể sử dụng getElement

> getElement(x, "ed") 
[1] 2 
8

$ không hoạt động trên vectơ nguyên tử. Sử dụng [ hoặc [[ để thay thế. Từ các tập tin trợ giúp cho $:

The default methods work somewhat differently for atomic vectors, matrices/arrays and for recursive (list-like, see is.recursive) objects. $ is only valid for recursive objects, and is only discussed in the section below on recursive objects.

x[["ed"]] sẽ làm việc.

25

Lý do bạn nhận được lỗi này là bạn có vector.

Nếu bạn muốn sử dụng toán tử $, bạn chỉ cần chuyển đổi số điện thoại thành số data.frame. Nhưng vì bạn chỉ có một hàng trong trường hợp cụ thể này, bạn cũng sẽ cần phải chuyển đổi nó; nếu không, bobed sẽ trở thành tên hàng thay vì tên cột của bạn, đó là những gì tôi nghĩ bạn muốn.

x <- c(1, 2) 
x 
names(x) <- c("bob", "ed") 
x <- as.data.frame(t(x)) 
x$ed 
[1] 2 
+3

Nó sẽ được dễ dàng hơn để sử dụng 'x <- as.list (x)'. –

+0

có cho 1 mục as.list sẽ tốt hơn. Tôi không bao giờ sử dụng danh sách vì vậy tôi luôn luôn quên chúng. – Dalupus

1

bộ sưu tập nguyên tử là truy cập Internet có thể lên $

bộ sưu tập đệ quy thì không. Thay vào đó [[]] được sử dụng. . .

Browse[1]> is.atomic(list()) 
[1] FALSE 

Browse[1]> is.atomic(data.frame()) 
[1] FALSE 

Browse[1]> is.atomic(class(list(foo="bar"))) 
[1] TRUE 

Browse[1]> is.atomic(c(" lang ")) 
[1] TRUE 

R có thể được vui đôi khi

a = list(1,2,3) 
b = data.frame(a) 
d = rbind("?",c(b)) 
e = exp(1) 
f = list(d) 
print(data.frame(c(list(f,e)))) 

... \

X1 X2 X3 X2.71828182845905 
1 ? ? ?   2.718282 
2 1 2 3   2.718282 
+1

Tôi nghĩ rằng bạn có điều này ngược. LIsts là các đối tượng đệ quy và có thể được truy cập thông qua $, các vector số là nguyên tử và không thể. Tôi không chắc những gì bạn đang cố gắng để hiển thị ở đây. –

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