สมมติว่าเรามีคำสั่งที่สร้างinteger(0)
เช่น
a <- which(1:3 == 5)
วิธีที่ปลอดภัยที่สุดในการจับสิ่งนี้คืออะไร?
สมมติว่าเรามีคำสั่งที่สร้างinteger(0)
เช่น
a <- which(1:3 == 5)
วิธีที่ปลอดภัยที่สุดในการจับสิ่งนี้คืออะไร?
any
ไฟล์. มันจะกลับเท็จอย่างใดอย่างหนึ่งหรือwhich(1:3==5)
1:3==5
integer(0)
ซึ่งฉันผลิตโดยใช้which
เป็นตัวอย่าง
which
? สิ่งนี้จะเป็นประโยชน์มากสำหรับฉันในการหลีกเลี่ยงรหัสที่ไม่ดี
คำตอบ:
นั่นคือวิธีของ R ในการพิมพ์เวกเตอร์ที่มีความยาวเป็นศูนย์ (จำนวนเต็มหนึ่ง) ดังนั้นคุณสามารถทดสอบa
ความยาว 0:
R> length(a)
[1] 0
มันอาจจะมีมูลค่าการทบทวนกลยุทธ์ที่คุณใช้ในการระบุซึ่งองค์ประกอบที่คุณต้องการ แต่ไม่มีรายละเอียดที่เฉพาะเจาะจงต่อไปมันเป็นเรื่องยากที่จะแนะนำกลยุทธ์ทางเลือก
ถ้าเป็นจำนวนเต็มที่มีความยาวเป็นศูนย์โดยเฉพาะคุณต้องการอะไรเช่น
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'.
!length(x)
มากกว่าlength(x)==0
length(x) == 0L
อ่านให้ชัดเจนกว่านี้สำหรับฉัน
L
คำต่อท้ายให้กับตัวเลขทำให้ R เก็บเป็นจำนวนเต็มแทนที่จะเป็นค่าทศนิยม ดูเช่นcran.r-project.org/doc/manuals/R-lang.html#Constants
อาจจะไม่ตรงประเด็น แต่ R มีสองฟังก์ชันที่ดีรวดเร็วและว่างเปล่าสำหรับการลดเวกเตอร์เชิงตรรกะ - any
และall
:
if(any(x=='dolphin')) stop("Told you, no mammals!")
is.empty
, cuz ฟังก์ชั่นบางส่วนจะกลับinteger(0)
แทนหรือNA
แต่ตอนนี้ทางของคุณเป็นตรงไปตรงมามากที่สุดและทำงานเวกเตอร์ที่ชาญฉลาดซึ่งเป็นข้อได้เปรียบใหญ่กว่าNULL
length(a)
แรงบันดาลใจจากคำตอบของ 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
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'")
isEmpty()
รวมอยู่ในแพ็คเกจฐาน S4Vectors ไม่ต้องโหลดแพ็คเกจอื่นใด
a <- which(1:3 == 5)
isEmpty(a)
# [1] TRUE