2013-10-29 32 views
13

是否有R A函數的行爲是這樣的:函數在R,NA,NULL,NaN上返回TRUE?

isnothing = function(x) { 
    is.null(x) | is.na(x) | is.nan(x) 
} 
+3

我真的不覺得有什麼,這是否與基函數。 NULL和NA是兩個完全不同的東西,你所建議的測試是融合這兩個概念。 – shadow

+0

當處理無經驗和/或無能的用戶時,這種功能的要點就是防禦性編碼,R用戶中有許多用戶。 – Backlin

+1

@Backlin該場景的前衛防守*應該是* ** RTFM **。我認爲教育社區比假設他們愚蠢更好(但是爲你的功能+1)。 –

回答

11

我還缺少這樣的功能,並增加前要對我.Rprofile青睞。如果有人知道一個基本函數可以做同樣的事情,我也想知道。

is.blank <- function(x, false.triggers=FALSE){ 
    if(is.function(x)) return(FALSE) # Some of the tests below trigger 
            # warnings when used on functions 
    return(
     is.null(x) ||    # Actually this line is unnecessary since 
     length(x) == 0 ||   # length(NULL) = 0, but I like to be clear 
     all(is.na(x)) || 
     all(x=="") || 
     (false.triggers && all(!x)) 
    ) 
} 

正如@shadow提到,NANaNNULL有那些重要的是瞭解不同的含義。不過,我發現這個函數很有用,當我使用默認值包含可選參數的函數時,我想允許用戶通過將其設置爲任何「未定義」值來禁止該函數。

一個這樣的例子是xlabplot。我永遠不會記得它是xlab=NAxlab=FALSE,xlab=NULLxlab=""。有些產生了期望的結果,有些則不產生,因此我發現在開發代碼時可以方便地使用上述功能,特別是如果其他人也會使用它。

-3

考慮is.finite()

!is.finite(NA) 
# TRUE 
!is.finite(NaN) 
# TRUE 

但它並不適用於NULL或字符輸入工作:

!is.finite(NULL) 
# logical(0) 
!is.finite("foo") 
# TRUE 

也(自然)

!is.finite(Inf) 
# TRUE 
+0

呃......'is.finite(1)'? -1 –

+1

這並不意味着返回1上的TRUE?正如我所說的,它會得到'NULL'和'Inf'錯誤,但它可能是OP的正確方向。 – Hugh

+1

我不認爲一個名爲'isnothing()'的函數應該返回給定的'TRUE'並輸入'1',否。對不起,我儘量避免投票,但我不認爲這真的是一個有用的答案,它甚至不通過OP中的所有測試。不錯,儘管嘗試! –

1

我有一個非常類似的問題太。我試圖檢查給定矩陣或數據框的行名是否正確。

x <- matrix(1:6,ncol=2) 
isnothing = function(x) { 
    any(is.null(x)) | any(is.na(x)) | any(is.nan(x)) 
} 
isnothing(rownames(x)) 

該函數將引發錯誤。但當我使用短路,並將其更改爲:

isnothing = function(x) { 
    any(is.null(x)) || any(is.na(x)) || any(is.nan(x)) 
} 
isnothing(rownames(x)) 

它解決了我的問題。我想先檢查第一個無效,然後繼續檢查其他情況是否FALSE解決了我的問題。我檢查了幾個有問題的案例,我可以想到它的工作。我不知道是否有例外,但現在它已經適用於我的目的。

rownames(x) <- c("a",NaN,NA) 
isnothing(rownames(x)) 
1

我相信你基本上是在尋找什麼gtools invalid()函數呢。

?gtools::invalid 

例如,

gtools::invalid(NA) 
[1] TRUE 
gtools::invalid(NULL) 
[1] TRUE 
gtools::invalid(NaN) 
[1] TRUE