จะจับจำนวนเต็ม (0) ได้อย่างไร?


139

สมมติว่าเรามีคำสั่งที่สร้างinteger(0)เช่น

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

วิธีที่ปลอดภัยที่สุดในการจับสิ่งนี้คืออะไร?


ฉันไม่ชอบแนวคิดที่จะถือว่ามันเป็นข้อผิดพลาด - อันที่จริงนโยบายของ R ในการไม่ยุบวัตถุว่างบางอย่างจะช่วยหลีกเลี่ยงกระแสการกู้คืนข้อผิดพลาดจำนวนมากและทำให้โค้ดสะอาดขึ้นมาก
mbq

20
อย่าใช้อันไหน
hadley

1
คุณสามารถทดสอบด้วยanyไฟล์. มันจะกลับเท็จอย่างใดอย่างหนึ่งหรือwhich(1:3==5) 1:3==5
IRTFM

@BondedDust ฉันพยายามค้นหาinteger(0)ซึ่งฉันผลิตโดยใช้whichเป็นตัวอย่าง
Roman Luštrik

6
ฉันรู้ว่ามันเก่า แต่คุณ Hadley ได้โปรดอธิบายว่าทำไมไม่ใช้which? สิ่งนี้จะเป็นประโยชน์มากสำหรับฉันในการหลีกเลี่ยงรหัสที่ไม่ดี
Cactus

คำตอบ:


166

นั่นคือวิธีของ R ในการพิมพ์เวกเตอร์ที่มีความยาวเป็นศูนย์ (จำนวนเต็มหนึ่ง) ดังนั้นคุณสามารถทดสอบ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'.

4
คุณสามารถใช้ได้!length(x)มากกว่าlength(x)==0
เจมส์

3
@ เจมส์. จริง แต่ฉันไม่คิดว่าจะมีปัญหาด้านประสิทธิภาพมากนักและlength(x) == 0Lอ่านให้ชัดเจนกว่านี้สำหรับฉัน
Richie Cotton

@RichieCotton. เกิดอะไรขึ้นกับ 0L เมื่อเทียบกับ 0? ฉันได้ลองใช้ googling แล้ว แต่ไม่พบสิ่งที่เกี่ยวข้อง ขออภัยเกี่ยวกับเวทมนตร์
eenblam

2
@ เบ็น: การเพิ่มLคำต่อท้ายให้กับตัวเลขทำให้ R เก็บเป็นจำนวนเต็มแทนที่จะเป็นค่าทศนิยม ดูเช่นcran.r-project.org/doc/manuals/R-lang.html#Constants
Richie Cotton

ขอบคุณ! มันประหยัดเวลาของฉัน
Andrii

12

อาจจะไม่ตรงประเด็น แต่ R มีสองฟังก์ชันที่ดีรวดเร็วและว่างเปล่าสำหรับการลดเวกเตอร์เชิงตรรกะ - anyและall:

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

1
ใช่จะดีถ้ามีสิ่งที่ชอบis.empty, cuz ฟังก์ชั่นบางส่วนจะกลับinteger(0)แทนหรือNA แต่ตอนนี้ทางของคุณเป็นตรงไปตรงมามากที่สุดและทำงานเวกเตอร์ที่ชาญฉลาดซึ่งเป็นข้อได้เปรียบใหญ่กว่าNULL length(a)
Ufos

7

แรงบันดาลใจจากคำตอบของ Andrie คุณสามารถใช้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'") 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.