পূর্ণসংখ্যা (0) কিভাবে ধরবেন?


136

ধরা যাক আমাদের একটি বিবৃতি রয়েছে যা উত্পন্ন করে integer(0), যেমন

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

এটি ধরা সবচেয়ে নিরাপদ উপায় কি?


এটিকে একটি ত্রুটি হিসাবে বিবেচনা করার ধারণাটি আমি পছন্দ করি না - আসলে কিছু খালি বস্তু নষ্ট না করার বিষয়ে আর-এর নীতি অনেক ত্রুটি-পুনরুদ্ধার প্রবাহ এড়াতে সহায়তা করে এবং এভাবে অনেক ক্লিনার কোডের দিকে নিয়ে যায়।
এমবিকিউ

20
যা ব্যবহার করবেন না।
হ্যাডলি

1
আপনি পরীক্ষা করতে পারেন any। এটি হয় which(1:3==5)বা এর জন্য মিথ্যা ফিরিয়ে দেবে 1:3==5
আইআরটিএফএম

@ বনেডডাস্ট আমি সন্ধানের চেষ্টা করছিলাম integer(0), যা আমি whichউদাহরণ হিসাবে ব্যবহার করে তৈরি করেছি ।
রোমান Luštrik

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। 0 এর বিপরীতে 0 এল দিয়ে কী হবে? আমি এটি গুগল করার চেষ্টা করেছি, তবে আমি প্রাসঙ্গিক কিছু খুঁজে পাচ্ছি না। ক্ষণিকের জন্য দুঃখিত।
eenblam

2
@ বেন: Lএকটি সংখ্যার সাথে প্রত্যয় যুক্ত করা এটি আর একটি ভাসমান পয়েন্টের মানের চেয়ে পূর্ণসংখ্যা হিসাবে সংরক্ষণ করে। দেখুন, যেমন, cran.r-project.org/doc/manouts/R-lang.html# কনস্ট্যান্টস
রিচি কটন

ধন্যবাদ! এটা আমার সময় সাশ্রয়।
Andrii

12

অফ-টপিক হতে পারে তবে আর যুক্তিযুক্ত ভেক্টর হ্রাস করার জন্য দুটি দুর্দান্ত, দ্রুত এবং খালি সচেতন ফাংশন বৈশিষ্ট্যযুক্ত - anyএবং all:

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

1
হ্যাঁ, এখানে দুর্দান্ত কিছু হবে যদি is.emptyকিছু ফাংশন বা এর integer(0)পরিবর্তে ফিরে আসে । তবে আপাতত আপনার পথটি সবচেয়ে সোজা, এবং ভেক্টর-ভিত্তিতে কাজ করে যা একটি বড় সুবিধা । NANULLlength(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

এটি সাদামাটা উত্তর নয়, তবে নবীনদের পক্ষে সবচেয়ে সহজ এবং নিরাপদ।
জেএএসসি

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.