ifelse函数返回空值的问题

27

我尝试在R中使用ifelse返回null,但出现错误信息。请问有什么建议吗?

这是我的代码:

cntr1 <- ifelse(unlist(gregexpr("---",path_info[j], fixed = TRUE, useBytes = TRUE)) > 0, 3 * length(unlist(gregexpr("---",path_info[j], fixed = TRUE, useBytes = TRUE))),NULL )

错误信息为:

Error in ifelse(unlist(gregexpr("---", path_info[j], fixed = TRUE, useBytes = TRUE)) >  : 
  replacement has length zero In addition: Warning message:
In rep(no, length.out = length(ans)) :
  'x' is NULL so the result will be NULL

我不相信这是可能的。从ifelse的帮助页面中,Value部分:一个与test和数据值长度相同的向量[...],其值来自于yes或no的值。而且length(NULL)返回零,所以你的no甚至不能被循环利用。 - Rui Barradas
我不知道这对你是否真的有用,但也许可以尝试返回"NULL"而不是返回NULL,这样你的ifelse就能起作用了,然后使用eval(parse(text = ...) )来确保NULL真正出现? - MBB
4
为什么你需要返回 NULL 呢?无论如何,在原子向量中你都不能拥有 NULL。在 R 中,NA 是表示缺失值的正确对象。 - LyzandeR
@LyzandeR使用NA不会得到长度为0。 - user2293224
4个回答

22

我想出了三种不同的方法来在类似于ifelse的情况下返回NULL

在这种情况下,当a为NULL时,b应该是NULL

a <- NULL
is.null(a)  #TRUE

b <- switch(is.null(a)+1,"notNullHihi",NULL)
b <- if(is.null(a)) NULL else {"notNullHihi"}
b <- unlist(ifelse(is.null(a),list(NULL),"notNullHihi"))

is.null(b)  #TRUE for each of them

“unlist”方法可能更加烦人,因为它可以在“FALSE”情况下修改对象(例如,如果您想返回一个“data.frame”)。 - ztl
这是一个很好的例子,说明为什么在R中编程是痛苦的。这些小而烦人的事情让人反复绊倒。大多数时候,错误信息并不会真正告诉你失败的原因,你必须进入其中,逐行执行代码,看看最终出了什么问题。 - Jonh Smith

4

我最近的一个应用程序需要类似的功能,这是我想出解决方案的方式。

obj <- "val1"

# Override a with null (this fails)
newobj <- ifelse(a == "val1", NULL, a)

# Separating the ifelse statement to if and else works

if(obj == "val1") newobj <- NULL else newobj <- obj


1

1
在您的特定情况下,如果ifelseyesno是单元素向量,则可以尝试将结果返回为列表。
ifelse(c(TRUE,FALSE,TRUE),list(1),list(NULL))
#[[1]]
#[1] 1
#
#[[2]]
#NULL
#
#[[3]]
#[1] 1

这种方法也适用于yesno中的任意一个是多元素列表的情况。例如,请参见:
x=as.list(1:3)
y=c(as.list(letters[1:2]),list(NULL))
ifelse(x<2,x,y)
#[[1]]
#[1] 1
#
#[[2]]
#[1] "b"
#
#[[3]]
#NULL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接