2010-02-01 14 views
38
में

मेरी आर कोड अप प्रपत्र के बयानों की अधिकता युक्त समाप्त होता है:विकल्प आर

if (!is.null(aVariable)) { 
    do whatever 
} 

लेकिन बयान इस तरह पढ़ने के लिए मुश्किल है, क्योंकि यह दो negations शामिल हैं। मैं की तरह कुछ पसंद करेंगे:

if (is.defined(aVariable)) { 
     do whatever 
} 

एक is.defined प्रकार समारोह है कि के विपरीत मानक अनुसंधान में मौजूद is.null करता है?

चियर्स, यानिक

+1

एक उपलब्ध कहां से आता है? क्या यह एक वेक्टर में एक तत्व है, एक समारोह के लिए एक वैश्विक या गैर वेक्टर तर्क? मेरे पास और सुझाव हो सकते हैं। –

+0

शायद 'मौजूद' है जो आप देख रहे हैं –

+1

के बारे में हैरान की टिप्पणी 'अस्तित्व' के बारे में नीचे देखें ... –

उत्तर

23

आप से बेहतर हो सकता है बाहर काम कर क्या मूल्य अपने कार्य या कोड लिखें स्वीकार करता है, और उस के लिए पूछ:

if (is.integer(aVariable)) 
{ 
    do whatever 
} 

यह isnull के ऊपर एक सुधार हो सकता है, क्योंकि यह प्रकार की जांच प्रदान करता है। दूसरी तरफ, यह आपके कोड की सामान्यता को कम कर सकता है।

वैकल्पिक रूप से, सिर्फ समारोह आप चाहते हैं:

is.defined = function(x)!is.null(x) 
+2

'is.defined' नाम सही नहीं है क्योंकि आप मूल्य' NULL' के साथ एक चर घोषित कर सकते हैं । कोशिश करें, उदा। 'एक्स <- न्यूल; x'। 'isnt.null' फ़ंक्शन के लिए एक अधिक उपयुक्त नाम होगा। –

+0

perl में, कम से कम, एक चर को परिभाषित नहीं किया जाता है यदि उसके पास मान अनिश्चित है, जो शून्य की तरह है। –

7

इयान टिप्पणी में रखते है, लेकिन मुझे लगता है कि यह एक अच्छा जवाब है:

if (exists("aVariable")) 
{ 
    do whatever 
} 

ध्यान दें कि चर नाम उद्धृत किया गया है।

+13

मुझे नहीं लगता कि यह वही है। 'मौजूद है' परीक्षण करता है कि परिवर्तनीय बाध्य है या नहीं। 'is.null' मानता है कि वेरिएबल बाध्य है, और परीक्षण करता है कि इसकी सामग्री ऑब्जेक्ट न्यूल है या नहीं। वे विनिमय नहीं कर सकते हैं। – Harlan

14

यदि यह आसानी से पढ़ने का मामला है, तो आप हमेशा अपने स्वयं के समारोह को परिभाषित कर सकते हैं:

is.not.null <- function(x) ! is.null(x) 

तो तुम यह सब अपने कार्यक्रम के साथ उपयोग कर सकते हैं।

is.not.null(3) 
is.not.null(NULL) 
1

shiny पैकेज की जाँच कि चर दोनों उपलब्ध है और मान्य हैं के लिए सुविधाजनक कार्यों validate() और need() प्रदान करता है। need() एक अभिव्यक्ति का मूल्यांकन करता है। अगर अभिव्यक्ति वैध नहीं है, तो एक त्रुटि संदेश लौटाया जाता है। अगर अभिव्यक्ति मान्य है, NULL वापस आ गया है। कोई यह जांचने के लिए इसका उपयोग कर सकता है कि कोई चर मान्य है या नहीं। अधिक जानकारी के लिए ?need देखें।

मैं इस तरह एक समारोह निर्धारित करने की सलाह:

is.valid <- function(x) { 
    require(shiny) 
    is.null(need(x, message = FALSE)) 
} 

इस समारोह is.valid() वापस आ जाएगी FALSE अगर xFALSE है, NULL, NA, NaN, एक खाली स्ट्रिंग "", एक खाली परमाणु वेक्टर, एक वेक्टर केवल युक्त गुम मूल्य, एक तार्किक वेक्टर जिसमें केवल FALSE है, या वर्ग try-error की एक वस्तु है। अन्य सभी मामलों में, यह TRUE देता है।

इसका मतलब है, need() (और is.valid()) विफलता मामलों की एक विस्तृत श्रृंखला को शामिल करता है।लेखन के बजाय:

if (!is.null(x) && !is.na(x) && !is.nan(x)) { 
    ... 
} 

एक बस लिख सकते हैं:

if (is.valid(x)) { 
    ... 
} 
वर्ग try-error के लिए चेक के साथ

, यह भी एक try() ब्लॉक के साथ संयोजन के रूप में इस्तेमाल किया जा सकता चुपचाप त्रुटियों को पकड़ने के लिए: (https://csgillespie.github.io/efficientR/programming.html#communicating-with-the-user देखें)

bad = try(1 + "1", silent = TRUE) 
if (is.valid(bad)) { 
    ... 
}