2012-04-29 12 views
26

में दो वैक्टरों की तुलना करना मैं एक फ़ंक्शन के अंदर स्टॉप स्थिति रखना चाहता हूं। शर्त यह है कि यदि पहले और दूसरे तत्वों को क्रम और लंबाई में पूरी तरह मेल खाना चाहिए।यदि एक कथन

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

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

यह आगे जाने के लिए

> A == C 

[1] TRUE FALSE TRUE FALSE 

के बाद से वहाँ एक झूठी इस हालत रोकने के लिए और उत्पादन के लिए है कि हालत 2 और 4 वें स्तंभ पर पकड़ doesnot है अच्छा स्थिति है।

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 

क्या मुझे कुछ स्पष्ट याद आ रही है? इसके अलावा मैं आउटपुट कर सकता हूं जहां त्रुटि की स्थिति है?

उत्तर

39

all एक विकल्प है:

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

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

लेकिन आप रीसाइक्लिंग के लिए बाहर देखने के लिए हो सकता है:

> 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 

length के लिए प्रलेखन का कहना है कि वर्तमान में यह केवल लंबाई 1 का पूर्णांक आउटपुट करता है, लेकिन यह भविष्य में बदल सकता है, इसलिए मैंने all में लम्बाई परीक्षण लपेट लिया।

+4

रीसाइक्लिंग के बारे में आपकी सावधानी यह है कि आपको 'isTRUE (all.equal (D, E)) का उपयोग क्यों करना चाहिए। –

+1

'all.equal.character' के लिए कोड को देखकर मुझे प्रबुद्ध किया गया था। फ्लोट्स के लिए "निकट-समानता" पहलू के कारण मुझे लगता है कि यह अन्य चीजों के लिए कुछ मजाकिया भी था। मुझे यकीन नहीं है कि, पीछे की ओर क्या। लेकिन नामों सहित सभी विशेषताओं की समानता की जांच करना केवल एकमात्र अवांछित चीज है। यह उपरोक्त मेरे सरल कोड की तुलना में 'एनए 'के साथ और अधिक सावधानी बरतता है। – Aaron

18

क्या वे समान हैं?

> identical(A,C) 
[1] FALSE 

कौन सा तत्व असहमत:

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

'समान' विशेषताएँ भी तुलना करता है, जो वांछनीय हो सकता है या नहीं भी हो सकता है। –

+0

कोई विशेषता यहां मौजूद नहीं है, लेकिन यह एक महत्वपूर्ण बात है। धन्यवाद। –

+0

'all.equal' गुणों की तुलना भी करता है, मुझे विश्वास है। – Aaron

7

मैं शायद all.equal और which प्रयोग करेंगे इच्छित जानकारी प्राप्त करने के लिए। किसी कारण से if...else ब्लॉक में all.equal का उपयोग करने की अनुशंसा नहीं की जाती है, इसलिए हम इसे isTRUE() में लपेटते हैं। अधिक के लिए ?all.equal देखें:

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!") 
    } 
} 

और उपयोग में:

> 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

कारण यह है कि जब वे बराबर नहीं होते हैं तो यह 'गलत' नहीं लौटाता है लेकिन यह वर्णन करता है कि वे कैसे भिन्न होते हैं। – Aaron

+0

@Aaron - हाँ वास्तव में। 'समान' के लिए सहायता पृष्ठ इस पर कुछ और अंतर्दृष्टि प्रदान करता है ... (जिसे मैं पोस्ट करने के बाद देखता हूं) – Chase