2012-06-02 32 views

Trả lời

44

Bạn không đưa ra ví dụ sao chép nhưng thông điệp cảnh báo của bạn cho bạn biết chính xác vấn đề là gì.

memb chỉ có độ dài là 10. Tôi đoán chiều dài của dih_y2 $ MemberID không phải là bội số của 10. Khi sử dụng ==, nó sẽ nhổ ra cảnh báo nếu nó không phải là bội số cho phép bạn biết rằng nó có thể không làm những gì bạn đang mong đợi nó đang làm. == kiểm tra phần tử bình đẳng. Tôi nghi ngờ những gì bạn muốn làm nếu tìm thấy các yếu tố của dih_y2$MemeberID cũng trong vector memb. Để làm điều này, bạn sẽ muốn sử dụng toán tử %in%.

dih_col <- which(dih_y2$MemeberID %in% memb) 
16

Khi bạn thực hiện một sự so sánh boolean giữa hai vectơ trong R, những "kỳ vọng" là cả hai vectơ là chiều dài tương tự, do đó R có thể so sánh từng phần tử tương ứng lần lượt.

R có nhiều tính năng được gọi là recycling, theo đó trong nhiều trường hợp nếu bạn cố gắng làm điều gì đó mà R thường mong đợi các đối tượng có cùng chiều dài, nó sẽ tự động mở rộng hoặc tái chế, ngắn hơn đối tượng để buộc cả hai đối tượng có cùng độ dài.

Nếu đối tượng dài hơn là bội số của ngắn hơn, số tiền này chỉ đơn giản lặp lại đối tượng ngắn hơn nhiều lần. Thông thường, các lập trình viên R sẽ tận dụng điều này để làm những việc nhỏ gọn hơn và ít bị đánh máy hơn.

Nhưng nếu chúng không phải là bội số, R sẽ lo lắng rằng bạn có thể đã phạm sai lầm và có lẽ không có nghĩa là thực hiện so sánh đó, do đó cảnh báo.

Khám phá chính mình bằng mã sau:

> x <- 1:3 
> y <- c(1,2,4) 
> x == y 
[1] TRUE TRUE FALSE 
> y1 <- c(y,y) 
> x == y1 
[1] TRUE TRUE FALSE TRUE TRUE FALSE 
> y2 <- c(y,2) 
> x == y2 
[1] TRUE TRUE FALSE FALSE 
Warning message: 
In x == y2 : 
    longer object length is not a multiple of shorter object length 
Các vấn đề liên quan