আর-তে বস্তু (পরিবর্তনশীল) সংজ্ঞায়িত হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


294

কোনও ত্রুটি না পেয়ে - কিছু ভেরিয়েবল আর-এ সংজ্ঞায়িত করা হয়েছে কিনা তা আমি পরীক্ষা করতে চাই। কিভাবে আমি এটি করতে পারব?

আমার প্রচেষ্টা (সফল নয়):

> is.na(ooxx)
Error: object 'ooxx' not found
> is.finite(ooxx)
Error: object 'ooxx' not found

ধন্যবাদ!

উত্তর:


448

আপনি চান exists():

R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R> 

3
@ গ্যাভিন এবং ডার্ক, আপনি একে অপরের প্রতি খুব সুন্দর :) কেবল সমাধান হল আপনি মুদ্রাটি টস করুন (পি = 0.5 :-) সহ বার্নোল্লি) কে গ্রহণ করবে! :-)
টিএমএস

29
@ টিটিম যদি আপনি কোনও ফাংশনের অভ্যন্তরে থাকেন তবে () মিস করছেন যা আপনি চান।
কাজিনকোচেন

2
তালিকার উপাদানগুলির জন্য যদি চেক করা যায় তবে কিছুটা জটিল হতে পারে: stackoverflow.com/q/7719741
টিএমএস

5
ওপি যা চেয়েছিল তার জন্য কী - ভেরিয়েবলের নাম ব্যবহার করে, কোটে নয়?
টিম

109

দেখুন ?exists, "... সংজ্ঞায়িত" এর কিছু সংজ্ঞার জন্য। যেমন

> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE

7
আপনি 52 সেকেন্ডের মাধ্যমে জয় করেছেন :)
ডার্ক এডেলবুয়েটেল 20'12

9
@ ডির্কএডেলবুয়েটেল ভাল, আপনি যদি হাস্যকরভাবে দীর্ঘ অবজেক্টের নাম ব্যবহার করেন ;-)
গ্যাভিন সিম্পসন

2
হেহ। পোস্ট করার আগে যখন উদাহরণগুলি পরীক্ষা করে দেখি তখন সবসময় আমার সাথে ঘটে থাকে, গ্যাভিন বা জোশ এরই উত্তর দিয়ে গেছে।
মাইসৌরা

60

আপনি যদি কোনও ফাংশনের ভিতরে থাকেন তবে () নিখোঁজ হ'ল যা আপনি চান।

exchequer = function(x) {
    if(missing(x)){
        message("x is missing… :-(")
    }
}

exchequer()
x is missing… :-(

missingতবে শুধুমাত্র ফাংশন আর্গুমেন্টের জন্য কাজ করে। আপনি করতে পারবেন না foo <- function(x) {missing(x); missing(y)}আপনি পাবেন foo(1) > Error in missing(y) : 'missing' can only be used for arguments
ড্যানিড

45

অন্যরা যেমন উল্লেখ করেছে, আপনি খুঁজছেন exists। মনে রাখবেন যে existsআর এর বেস প্যাকেজগুলির দ্বারা ব্যবহৃত নামগুলি ব্যবহার করে আপনি ভেরিয়েবলটি সংজ্ঞায়িত না করেই সত্য ফিরে আসবেন:

> exists("data")
[1] TRUE

এটি পেতে (বাজ দ্বারা চিহ্নিত হিসাবে; দেখুন ?exists), inheritsযুক্তিটি ব্যবহার করুন :

> exists("data", inherits = FALSE)
[1] FALSE

foo <- TRUE
> exists("foo", inherits = FALSE)
[1] TRUE

অবশ্যই, আপনি যদি সংযুক্ত প্যাকেজগুলির নামের জায়গাগুলি সন্ধান করতে চান তবে এটিও হ্রাস পাবে:

> exists("data.table")
[1] FALSE
require(data.table)
> exists("data.table", inherits = FALSE)
[1] FALSE
> exists("data.table")
[1] TRUE

সংযুক্ত প্যাকেজ অনুসন্ধান কিন্তু - আমি শুধু মনে করতে পারেন এই কাছাকাছি পেতে না বেস প্যাকেজ - নিম্নলিখিত হল:

any(sapply(1:(which(search() == "tools:rstudio") - 1L),
           function(pp) exists(_object_name_, where = pp, inherits = FALSE)))

( ) বনাম ( ) এর _object_name_সাথে প্রতিস্থাপনের সাথে তুলনা করুন"data.table"TRUE"var"FALSE

(অবশ্যই, আপনি আর স্টুডিওতে না থাকলে, আমি মনে করি প্রথম স্বয়ংক্রিয়ভাবে সংযুক্ত পরিবেশটি "package:stats")


2
চারপাশে খেলতে, যুক্তি ব্যবহার inherits = FALSEকরে বিশ্ব পরিবেশে জিনিসগুলি বিচ্ছিন্ন বলে মনে হয়। এটা ঠিক আছে?
সিজেবি

1
@ বাজ আপনি ঠিক আছেন; আমি উত্তরে এডিট করেছি।
মাইকেলচিরিকো

2
এই মন্তব্যটি উচ্চতর হওয়া উচিত, যেহেতু আমি ভেরিয়েবল নাম "ডেটা" ব্যবহার করি, কেবল উপস্থিত থাকা আমাকে প্রাথমিকভাবে কিছুটা সমস্যা দেয়।
এমজেএম

25

আপনি যদি উদ্ধৃতি ব্যবহার করতে না চান, আপনি deparse(substitute())কৌশলটি ব্যবহার করতে পারেন যা আমি উদাহরণ বিভাগে পেয়েছি ?substitute:

is.defined <- function(sym) {
  sym <- deparse(substitute(sym))
  env <- parent.frame()
  exists(sym, env)
}

is.defined(a)
# FALSE
a <- 10
is.defined(a)
# TRUE

1
আপনি forceএটির মতো বা is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
ফাংশনটিতে

1

এমন পরিস্থিতি থাকতে পারে যেখানে আপনি যে ভেরিয়েবলটির সন্ধান করছেন তার নামটি সঠিকভাবে আপনি জানেন না, যেমন একটি সারি ব্যবস্থা দ্বারা ফলাফলের অ্যারে তৈরি করা হয়েছিল। এগুলি সম্ভবত "ls" এবং এর যুক্তি "প্যাটার্ন" দিয়ে সম্বোধন করা যেতে পারে যা নিয়মিত প্রকাশের প্রত্যাশা করে।

"বিদ্যমান" ফাংশনটি সেইভাবে পুনরায় প্রয়োগ করা যেতে পারে

exists <-function(variablename) {
   #print(ls(env=globalenv()))
   return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}

এই উত্তরটি প্রস্তুত করার সময়, কোনও ক্রিয়াকলাপের মধ্য দিয়ে ls () কে আহ্বান করার সময় আমি পরিবেশের নির্দিষ্টকরণের প্রয়োজনীয়তার জন্য কিছুটা অবাক হয়েছিলাম । সুতরাং, তার জন্য আপনাকে ধন্যবাদ, স্ট্যাকওভারফ্লো! এখানে একটি "all.names" বৈশিষ্ট্যও রয়েছে যা আমার সত্য হিসাবে সেট করা উচিত ছিল তবে বাদ দেওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.