2013-08-24 9 views
5

मान लीजिए कि मेरे पास कुछ चरित्र वेक्टर हैं, जिन्हें मैं उन तत्वों को सब्सक्राइब करना चाहता हूं जो कुछ नियमित अभिव्यक्ति से मेल नहीं खाते हैं। मैं grep मैचों सबसेट को दूर करने के - ऑपरेटर का उपयोग हो सकता है:खाली grep के सभी पर सब्सक्रिप्शन खाली वेक्टर

> vec <- letters[1:5] 
> vec 
[1] "a" "b" "c" "d" "e" 
> vec[-grep("d", vec)] 
[1] "a" "b" "c" "e" 

मैं प्रविष्टियों को "d" का मिलान नहीं हुआ छोड़कर वापस दिए गए कर रहा हूँ सब कुछ। लेकिन अगर मैं एक नियमित अभिव्यक्ति है कि नहीं पाया जाता है, बजाय सब कुछ वापस के रूप में मैं उम्मीद करेंगे होने का खोजते हैं, तो मैं कुछ भी नहीं वापस पाने:

> vec[-grep("z", vec)] 
character(0) 

इस क्यों होता है?

उत्तर

8

ऐसा इसलिए है क्योंकि grep एक पूर्णांक वेक्टर देता है, और जब कोई मिलान नहीं होता है, तो यह integer(0) देता है।

> grep("d", vec) 
[1] 4 
> grep("z", vec) 
integer(0) 

और - ऑपरेटर elementwise काम करता है, और integer(0) कोई तत्व है के बाद से, निषेध पूर्णांक वेक्टर परिवर्तन नहीं करता है: vec[-integer(0)] जो बारी में vec[integer(0)] का मूल्यांकन करने के लिए

> -integer(0) 
integer(0) 

तो vec[-grep("z", vec)] का मूल्यांकन करता है , जो character(0) है।

आप व्यवहार आप invert = TRUE साथ उम्मीद मिल जाएगा:

> vec[grep("d", vec, invert = TRUE)] 
[1] "a" "b" "c" "e" 
> vec[grep("z", vec, invert = TRUE)] 
[1] "a" "b" "c" "d" "e" 
संबंधित मुद्दे