2010-02-01 113 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)) { 
    ... 
}