2012-04-29 40 views
26

Tôi muốn đặt điều kiện dừng bên trong một hàm. Điều kiện là nếu các yếu tố đầu tiên và thứ hai phải khớp hoàn toàn theo thứ tự và chiều dài.So sánh hai vectơ trong câu lệnh if

A <- c("A", "B", "C", "D") 
B <- A 
C <- c("A", "C", "C", "E") 

> A == B 
[1] TRUE TRUE TRUE TRUE 

Đây là tình hình tốt để đi về phía trước

> A == C 

[1] TRUE FALSE TRUE FALSE 

Kể từ khi có một sai tình trạng này phải dừng lại và đầu ra rằng tình trạng này doesnot giữ ở mức 2 và 4 cột thứ.

if (A != B) { 
      stop("error the A and B does not match at column 2 and 4"} else { 
      cat ("I am fine") 
       } 
Warning message: 
In if (A != B) (stop("error 1")) : 
    the condition has length > 1 and only the first element will be used 

Tôi có thiếu thứ gì đó hiển nhiên không? Ngoài ra tôi có thể xuất ra vị trí lỗi ở đâu?

Trả lời

39

all là một lựa chọn:

> A <- c("A", "B", "C", "D") 
> B <- A 
> C <- c("A", "C", "C", "E") 

> all(A==B) 
[1] TRUE 
> all(A==C) 
[1] FALSE 

Nhưng bạn có thể phải xem ra để tái chế:

> D <- c("A","B","A","B") 
> E <- c("A","B") 
> all(D==E) 
[1] TRUE 
> all(length(D)==length(E)) && all(D==E) 
[1] FALSE 

tài liệu cho length nói rằng hiện tại nó chỉ xuất ra một số nguyên có độ dài 1, nhưng nó có thể thay đổi trong tương lai, vì vậy đó là lý do tại sao tôi bọc thử nghiệm độ dài trong all.

+4

Thận trọng về tái chế là lý do tại sao bạn nên sử dụng' isTRUE (all.equal (D, E)) '. –

+1

Nhìn vào mã cho 'all.equal.character' đã khai sáng cho tôi. Bởi vì khía cạnh "gần như bình đẳng" của nó cho phao nổi, tôi cho rằng nó đã làm điều gì đó buồn cười cho những thứ khác nữa. Tôi không chắc chắn, nhìn lại. Nhưng điều duy nhất có lẽ không mong muốn nó làm là kiểm tra sự bình đẳng của tất cả các thuộc tính, bao gồm cả tên. Nó cũng cần phải cẩn thận hơn với 'NA' hơn là mã đơn giản của tôi ở trên. – Aaron

18

Chúng có giống nhau không?

> identical(A,C) 
[1] FALSE 

Những yếu tố không đồng ý:

> which(A != C) 
[1] 2 4 
+4

'giống hệt nhau 'cũng so sánh các thuộc tính, có thể hoặc không được mong muốn. –

+0

Không có thuộc tính nào có mặt ở đây, nhưng đó là một điểm quan trọng. Cảm ơn. –

+0

'all.equal' cũng so sánh các thuộc tính, tôi tin. – Aaron

7

tôi có lẽ muốn sử dụng all.equalwhich để có được những thông tin mà bạn muốn. Bạn không nên sử dụng all.equal trong một khối if...else vì một số lý do, vì vậy chúng tôi quấn nó trong isTRUE(). Xem ?all.equal để biết thêm:

foo <- function(A,B){ 
    if (!isTRUE(all.equal(A,B))){ 
    mismatches <- paste(which(A != B), collapse = ",") 
    stop("error the A and B does not match at the following columns: ", mismatches) 
    } else { 
    message("Yahtzee!") 
    } 
} 

Và trong sử dụng:

> foo(A,A) 
Yahtzee! 
> foo(A,B) 
Yahtzee! 
> foo(A,C) 
Error in foo(A, C) : 
    error the A and B does not match at the following columns: 2,4 
+1

Lý do là khi chúng không bằng nhau, nó không trả về 'FALSE' nhưng mô tả chúng khác nhau như thế nào. – Aaron

+0

@Aaron - đúng vậy. Trang trợ giúp cho '? Same' cho một số thông tin chi tiết hơn về điều này ... (mà tôi sử dụng sau khi đăng) – Chase

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