我的R代码里面最终的形式的语句包含过多:替代R中
if (!is.null(aVariable)) {
do whatever
}
但这种说法是很难读,因为它包含两个否定。我宁愿是这样的:!
if (is.defined(aVariable)) {
do whatever
}
这是否确实相反is.null R中存在的is.defined
型功能的标准呢?
欢呼声, 雅尼克
我的R代码里面最终的形式的语句包含过多:替代R中
if (!is.null(aVariable)) {
do whatever
}
但这种说法是很难读,因为它包含两个否定。我宁愿是这样的:!
if (is.defined(aVariable)) {
do whatever
}
这是否确实相反is.null R中存在的is.defined
型功能的标准呢?
欢呼声, 雅尼克
你可能会更好的工作出了什么价值键入功能或代码接受,并要求为:
if (is.integer(aVariable))
{
do whatever
}
这可能是在ISNULL的改进,因为它提供类型检查。另一方面,它可能会降低代码的通用性。
或者,只是让你想要的功能:伊恩把这个注释
is.defined = function(x)!is.null(x)
'is.defined'这个名称不太正确,因为你可以声明一个值为NULL的变量。尝试,例如'x < - NULL; x'。 'isnt.null'将是该函数更合适的名称。在perl中至少有一个变量 – 2010-02-02 12:19:48
,如果一个变量的值为undef,则这个变量被认为是没有定义的,这个值就像null。 – 2010-02-02 17:16:43
,但我认为这是一个很好的答案:
if (exists("aVariable"))
{
do whatever
}
注意变量名称被引用。
我不认为这是一样的。 'exists'测试变量是否被绑定。 'is.null'假定变量被绑定,并测试其内容是否为NULL对象。它们不可互换。 – Harlan 2010-02-01 22:02:41
如果它只是一个易于阅读的事情,你总是可以定义自己的功能:
is.not.null <- function(x) ! is.null(x)
所以,你可以用它一直以来你的程序。
is.not.null(3)
is.not.null(NULL)
的shiny
软件包提供了方便的功能validate()
和need()
用于检查变量都可用且有效。 need()
评估一个表达式。如果表达式无效,则返回错误消息。如果表达式有效,则返回NULL
。可以用它来检查一个变量是否有效。有关更多信息,请参阅?need
。
我建议定义一个函数是这样的:
is.valid <- function(x) {
require(shiny)
is.null(need(x, message = FALSE))
}
此功能is.valid()
将返回FALSE
如果x
是FALSE
,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)) {
...
}
aVariable从何而来?它是向量中的元素,是函数的全局或非向量参数?我可能会有更多的建议。 – 2010-02-01 10:44:16
或许'存在'已接近你正在寻找的 – 2010-02-01 17:08:12
请参阅下面有关'存在'的Harlan的评论... – 2010-02-02 11:12:38