जवाबों:
आप चाहते हैं exists()
:
R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R>
देखें ?exists
, "... परिभाषित है" की कुछ परिभाषा के लिए। उदाहरण के लिए
> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
यदि आप किसी फ़ंक्शन के अंदर हैं, तो गायब है () वही है जो आप चाहते हैं।
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
।
जैसा कि दूसरों ने बताया है, आप ढूंढ रहे हैं exists
। ध्यान रखें कि exists
R के आधार पैकेजों द्वारा उपयोग किए जाने वाले नामों के साथ प्रयोग करना सही होगा, भले ही आपने चर को परिभाषित किया हो:
> 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
(बेशक, अगर आप RStudio पर नहीं हैं, तो मुझे लगता है कि पहला स्वचालित रूप से संलग्न वातावरण है "package:stats"
)
inherits = FALSE
करना वैश्विक वातावरण में चीजों को अलग करना प्रतीत होता है। क्या यह सही है?
यदि आप उद्धरण का उपयोग नहीं करना चाहते हैं, तो आप उस 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
force
इसे इस तरह से कार्य कर सकते हैं या इसका मूल्यांकन कर सकते हैं :is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
ऐसी परिस्थितियां हो सकती हैं जिनमें आप उस चर का नाम नहीं जानते, जिसे आप खोज रहे हैं, जैसे जब एक कतार प्रणाली द्वारा परिणामों का एक सरणी बनाया गया हो। इन्हें संभवतः "एलएस" और इसके तर्क "पैटर्न" के साथ संबोधित किया जा सकता है जो एक नियमित अभिव्यक्ति की अपेक्षा करता है।
"मौजूद" फ़ंक्शन को इस तरह से फिर से लागू किया जा सकता है
exists <-function(variablename) {
#print(ls(env=globalenv()))
return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}
इस उत्तर को तैयार करते समय, मैं एक फ़ंक्शन के भीतर से ls () को लागू करते समय पर्यावरण के विनिर्देश की आवश्यकता के बारे में थोड़ा आश्चर्यचकित था । तो, इसके लिए धन्यवाद, स्टैकओवरफ़्लो! एक "all.names" विशेषता भी है जिसे मुझे सही पर सेट करना चाहिए लेकिन छोड़ दिया गया है।