2010-02-01 114 views
38

我的R代碼裏面最終的形式的語句包含過多:替代R中

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

但這種說法是很難讀,因爲它包含兩個否定。我寧願是這樣的:!

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

這是否確實相反is.null R中存在的is.defined型功能的標準呢?

歡呼聲, 雅尼克

+1

aVariable從何而來?它是向量中的元素,是函數的全局或非向量參數?我可能會有更多的建議。 – 2010-02-01 10:44:16

+0

或許'存在'已接近你正在尋找的 – 2010-02-01 17:08:12

+1

請參閱下面有關'存在'的Harlan的評論... – 2010-02-02 11:12:38

回答

23

你可能會更好的工作出了什麼價值鍵入功能或代碼接受,並要求爲:

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

這可能是在ISNULL的改進,因爲它提供類型檢查。另一方面,它可能會降低代碼的通用性。

或者,只是讓你想要的功能:伊恩把這個註釋

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

'is.defined'這個名稱不太正確,因爲你可以聲明一個值爲NULL的變量。嘗試,例如'x < - NULL; x'。 'isnt.null'將是該函數更合適的名稱。在perl中至少有一個變量 – 2010-02-02 12:19:48

+0

,如果一個變量的值爲undef,則這個變量被認爲是沒有定義的,這個值就像null。 – 2010-02-02 17:16:43

7

,但我認爲這是一個很好的答案:

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

注意變量名稱被引用。

+13

我不認爲這是一樣的。 'exists'測試變量是否被綁定。 'is.null'假定變量被綁定,並測試其內容是否爲NULL對象。它們不可互換。 – Harlan 2010-02-01 22:02:41

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如果xFALSENULLNANaN,一個空字符串"",空原子向量,只含有載體缺失值,僅包含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)) { 
    ... 
}