2012-02-20 26 views
187

मैं यह जांचना चाहता हूं कि कुछ चर को आर में परिभाषित किया गया है - बिना त्रुटि के। मैं यह कैसे कर सकता हूँ?आर में ऑब्जेक्ट (चर) परिभाषित किया गया है या नहीं?

मेरे प्रयास (सफल नहीं):

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

धन्यवाद!

उत्तर

308

आप exists() हैं:

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

+1 कहा, आप एक दूसरे के लिए बहुत अच्छे हैं :) केवल समाधान यह है कि आप सिक्के को टॉस करते हैं (पी = 0.5 :-) के साथ बर्नौली) जो स्वीकार करेंगे ! :-) –

+1

@ गैविन और डिर्क का उपयोग करने के लिए – TMS

+19

@tim अगर आप किसी फ़ंक्शन के अंदर हैं, तो गायब() वह है जो आप चाहते हैं। – CousinCocaine

82

"परिभाषित किया गया है" की कुछ परिभाषा के लिए ?exists देखें। जैसे

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

आप 52 सेकंड :) –

+4

@DirkEddelbuettel ठीक है, से जीत अगर आप हास्यास्पद लंबे वस्तु के नाम का उपयोग करेगा; -) –

+1

हे। जब मैं पोस्ट करने से पहले उदाहरणों का परीक्षण कर रहा हूं, तब हर समय मेरे पास होता है, गैविन या जोश ने पहले ही इसका जवाब दिया है। '42' - nuff ने – Maiasaura

41

यदि आप एक समारोह के अंदर हैं, लापता() तुम क्या चाहते है।

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

exchequer() 
x is missing… :-(
36

के रूप में अन्य लोगों ने बताया है, तो आप exists के लिए देख रहे हैं। ध्यान रखें कि आर के आधार पैकेज द्वारा प्रयुक्त नाम के साथ exists का उपयोग करने का है कि क्या आप चर परिभाषित यह बात लागू वापसी होगी:

> exists("data") 
[1] TRUE 

इस के आसपास पाने के लिए (के रूप में Bazz से कहा; ?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))) 

"data.table" (TRUE) बनाम "var" साथ _object_name_ की जगह की तुलना करें (FALSE)

(यदि आप RStudio पर नहीं कर रहे हैं, ज़ाहिर है, मुझे लगता है कि पहला स्वचालित रूप से संलग्न वातावरण "package:stats" है)

+1

तर्क 'विरासत = FALSE' का उपयोग करके, आसपास के आसपास बजाना वैश्विक वातावरण में चीजों को अलग करना प्रतीत होता है। क्या यह सही लगता है? – Bazz

+0

@Bazz आप सही हैं; मैंने इसे उत्तर में संपादित किया है। – MichaelChirico

+1

यह टिप्पणी अधिक होनी चाहिए, क्योंकि मैं परिवर्तनीय नाम "डेटा" का उपयोग करता हूं, केवल अस्तित्व का उपयोग करके मुझे कुछ परेशानी होती है। – mzm

8

आप के लिए नहीं करना चाहते हैं उद्धरण चिह्नों का उपयोग, आप deparse उपयोग कर सकते हैं (स्थानापन्न()) चाल मैं स्थानापन्न के उदाहरण अनुभाग में पाया जो:

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

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

मेरी इच्छा है कि लोग जानते होंगे कि यह कितना बीमार था। अच्छा कार्य। –

+0

आप इस तरह के फ़ंक्शन में इसे 'बल' या मूल्यांकन भी कर सकते हैं: 'is.defined <- function (sym) class (try (sym, TRUE))! = 'Try-error'' – chinsoon12

संबंधित मुद्दे