if/while(condition){:参数的长度为零时出错

Cra*_*ght 32 r r-faq

我收到了错误

Error in if (condition) { : argument is of length zero
Run Code Online (Sandbox Code Playgroud)

要么

Error in while (condition) { : argument is of length zero
Run Code Online (Sandbox Code Playgroud)

是什么导致此错误消息,这是什么意思?

在进一步检查时,似乎价值是NULL.

condition
## NULL
Run Code Online (Sandbox Code Playgroud)

为了处理这个错误,我该如何测试NULL值?

我希望这会返回TRUE,但我得到一个空的逻辑值:

condition == NULL
## logical(0)
Run Code Online (Sandbox Code Playgroud)

GSe*_*See 38

看到 ?NULL

你必须使用 is.null

'is.null'如果参数为'NULL'则返回'TRUE',否则返回'FALSE'.

试试这个:

if ( is.null(hic.data[[z]]) ) { print("is null")}
Run Code Online (Sandbox Code Playgroud)

R语言定义的 2.1.6节

有一个名为NULL的特殊对象.只要需要指示或指定对象不存在,就会使用它.它不应与矢量或零长度列表混淆.NULL对象没有类型,也没有可修改的属性.R中只有一个NULL对象,所有实例都引用该对象.要测试NULL,请使用is.null.您不能在NULL上设置属性.


Ric*_*ton 16

是什么导致此错误消息,这是什么意思?

if 语句采用单个逻辑值(技术上是长度为1的逻辑向量)作为条件的输入.

输入条件长度为零时抛出错误.你可以用它来重现它,例如:

if (logical()) {}
## Error: argument is of length zero

if (NULL) {}
## Error: argument is of length zero    
Run Code Online (Sandbox Code Playgroud)

导致此错误的常见错误

使用$索引时很容易意外地导致此错误.例如:

l <- list(a = TRUE, b = FALSE, c = NA)
if(l$d) {}   
## Error in if (l$d) { : argument is of length zero
Run Code Online (Sandbox Code Playgroud)

同时使用if- else当你的意思ifelse,或覆盖TF.


请注意以下其他不良情况的相关错误和警告:

if/while(condition)中的错误{:缺少需要TRUE/FALSE的值

if/while(condition)出错:参数不能解释为逻辑

if (NA) {}
## Error: missing value where TRUE/FALSE needed

if ("not logical") {}
## Error: argument is not interpretable as logical

if (c(TRUE, FALSE)) {}
## Warning message:
## the condition has length > 1 and only the first element will be used
Run Code Online (Sandbox Code Playgroud)

我如何测试这些值?

NULL值可以测试使用is.null.有关更多详细信息,请参阅GSee的答案.

为了使您的电话if安全,一个好的代码模式是:

if(!is.null(condition) && 
   length(condition) == 1 && 
   !is.na(condition) && 
   condition) {
  # do something
}
Run Code Online (Sandbox Code Playgroud)

你也可以想看看assert_is_if_conditionassertive.code.

  • 事实上,这是一个“好的模式”,这对于 R 来说是相当尴尬的。 (2认同)

Wil*_*uck 5

在测试NULL值时,您要使用is.null(hic.data[[z]]).