पूर्णांक (0) कैसे पकड़ें?


136

मान लीजिए कि हमारे पास एक बयान है जो integer(0)उदाहरण के लिए, उत्पादन करता है

 a <- which(1:3 == 5)

इसे पकड़ने का सबसे सुरक्षित तरीका क्या है?


मुझे इसे एक त्रुटि के रूप में मानने का विचार पसंद नहीं है - वास्तव में कुछ खाली वस्तुओं को नहीं गिराने की आर की नीति कई त्रुटि-पुनर्प्राप्त प्रवाह से बचने में मदद करती है, और इस प्रकार बहुत क्लीनर कोड की ओर जाता है।
mbq

20
जो प्रयोग न करें।
हैडली

1
आप के साथ परीक्षण कर सकते हैं any। यह which(1:3==5)या तो या के लिए FALSE लौटाएगा 1:3==5
IRTFM

@BondedDust मैं खोजने की कोशिश कर रहा था integer(0), जिसे मैंने whichएक उदाहरण के रूप में इस्तेमाल किया।
रोमन लुसट्रिक

6
मुझे पता है कि यह पुराना है, लेकिन क्या आप, हैडली, कृपया इस बात की रूपरेखा तैयार कर लें कि इसका उपयोग क्यों नहीं करना चाहिए which? खराब कोड से बचने के लिए यह मेरे लिए बहुत मददगार होगा।
कैक्टस

जवाबों:


162

यह एक शून्य लंबाई वेक्टर (एक पूर्णांक एक) को प्रिंट करने का आर का तरीका है, इसलिए आप aलंबाई 0 होने के लिए परीक्षण कर सकते हैं :

R> length(a)
[1] 0

यह उस रणनीति पर पुनर्विचार करने के लायक हो सकता है जिसका उपयोग आप पहचानने के लिए कर रहे हैं कि आप कौन से तत्व चाहते हैं, लेकिन आगे के विशिष्ट विवरण के बिना वैकल्पिक रणनीति का सुझाव देना मुश्किल है।


19

यदि यह विशेष रूप से शून्य लंबाई पूर्णांक है , तो आप कुछ ऐसा चाहते हैं

is.integer0 <- function(x)
{
  is.integer(x) && length(x) == 0L
}

इसे देखें:

is.integer0(integer(0)) #TRUE
is.integer0(0L)         #FALSE
is.integer0(numeric(0)) #FALSE

आप इसके लिए भी उपयोग कर सकते हैं assertive

library(assertive)
x <- integer(0)
assert_is_integer(x)
assert_is_empty(x)
x <- 0L
assert_is_integer(x)
assert_is_empty(x)
## Error: is_empty : x has length 1, not 0.
x <- numeric(0)
assert_is_integer(x)
assert_is_empty(x)
## Error: is_integer : x is not of class 'integer'; it has class 'numeric'.

3
आप इसके !length(x)बजाय सिर्फ उपयोग कर सकते हैंlength(x)==0
जेम्स

3
@James। सच है, लेकिन मुझे नहीं लगता कि किसी भी तरह से एक प्रदर्शन मुद्दा है, और length(x) == 0Lमेरे लिए और अधिक स्पष्ट रूप से पढ़ता है।
रिची कॉटन

@RichieCotton। 0L के साथ 0 के विपरीत क्या है? मैंने इसे देखने की कोशिश की है, लेकिन मुझे कुछ भी प्रासंगिक नहीं मिल रहा है। नेक्रोमेंसी के बारे में क्षमा करें।
eenblam

2
@Ben: Lकिसी संख्या में एक प्रत्यय जोड़ने से R इसे एक फ्लोटिंग पॉइंट मान के बजाय पूर्णांक के रूप में संग्रहीत करता है। देखें, उदाहरण के लिए, cran.r-project.org/doc/manuals/R-lang.html#Constants
Richie Cotton

धन्यवाद! यह मेरा समय बच गया है।
एंड्री

12

शायद ऑफ-टॉपिक, लेकिन आर तार्किक वैक्टर को कम करने के लिए दो अच्छे, तेज और खाली-जागरूक कार्यों को पेश करता है - anyऔर all:

if(any(x=='dolphin')) stop("Told you, no mammals!")

1
हाँ, महान अगर वहाँ की तरह कुछ था होगा is.emptycuz, कुछ कार्यों लौटने integer(0)के बजाय NAया NULL। लेकिन अब के लिए आपका रास्ता सबसे सीधा है, और वेक्टर-वार काम करता है जो कि एक बड़ा फायदा है length(a)
उफोस

7

एंड्री के उत्तर से प्रेरित होकर, आप identicalइस तथ्य का उपयोग करके किसी भी विशेषता समस्याओं का उपयोग कर सकते हैं और उससे बच सकते हैं कि यह ऑब्जेक्ट के उस वर्ग का खाली सेट है और इसे उस वर्ग के एक तत्व के साथ संयोजित करें:

attr(a,"foo")<-"bar"

> identical(1L,c(a,1L))
[1] TRUE

या अधिक आम तौर पर:

is.empty <- function(x, mode=NULL){
    if (is.null(mode)) mode <- class(x)
    identical(vector(mode,1),c(x,vector(class(x),1)))
}

b <- numeric(0)

> is.empty(a)
[1] TRUE
> is.empty(a,"numeric")
[1] FALSE
> is.empty(b)
[1] TRUE
> is.empty(b,"integer")
[1] FALSE

यह सबसे सरल उत्तर नहीं है, लेकिन अब तक शुरुआती लोगों के लिए सबसे सरल और सबसे सुरक्षित है।
JASC

7
if ( length(a <- which(1:3 == 5) ) ) print(a)  else print("nothing returned for 'a'") 
#[1] "nothing returned for 'a'"

दूसरे विचार पर मुझे लगता है कि कोई भी इससे अधिक सुंदर है length(.):

 if ( any(a <- which(1:3 == 5) ) ) print(a)  else print("nothing returned for 'a'") 
 if ( any(a <- 1:3 == 5 ) ) print(a)  else print("nothing returned for 'a'") 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.