R-如何在IF语句中测试字符(0)


78

我认为这非常简单,但是我似乎找不到答案。

我正在编写IF语句,但是测试是对象是否返回character(0)值。我不确定character(0)声明中的处理方式。

假设Test <- character(0)或一个值:

if (identical(Pols4,character(0))) {
  print('Empty')
} else {
  print('Not Empty')
}

它似乎仍然不起作用.....


2
length(character(0))为零,if (length(x))应该这样做。
tonytonov

5
不抱歉,事实并非如此。length(NULL)也为零length(numeric(0))
Patrick Roocks 2014年

3
将您的第一行更改为if(identical(Test, character(0)))无效?
David Arenburg 2014年

if else语句引发错误:“}”中出现意外的'}'
Methexis 2014年

1
什么Pols4?? 它适用于Test
David Arenburg 2014年

Answers:


97

使用此identical功能进行检查。

a <- character(0)
identical(a, character(0))  # returns TRUE

identical(a, "")           # returns FALSE
identical(a, numeric(0))   # returns also FALSE

1
在使用FALSE之前,我仍然会得到回报,identical(a,as.Date(character(0))因为character(0)即使我在代码中将结果强制转换为日期之后,该值仍显示为。
Climbs_lika_Spyder

1
如果将值强制转换为Date,则它与并不相同character(0),因此此行为完全可以。quote(character(0))也显示为character(0)在控制台中,并且肯定与不一致character(0)
Patrick Roocks'Mar

1
我没有抱怨。我只是在分享以防别人有类似的情况。
Climbs_lika_Spyder '17

出于好奇,为什么a == character(0) 返回logical(0)而不是返回TRUE
stevec

因为==作品vectorwise(参见c("a","b")==c("a","c")返回c(TRUE,FALSE)),并character(0)是一个“类型长度为0的‘字符’的载体”(参见c("a", character(0))相同"a")。因此,“长度为'0'的'逻辑'类型的向量”是声音结果。
Patrick Roocks

12

添加强制性tidyverse答案。该rlang软件包具有功能is_empty(),它可以完全满足您的需求。

Test <- character(0)
rlang::is_empty(Test)
#[1] TRUE

这也适用于非字符的空向量。例如,它在Patrick Roocks在评论中描述的情况下有效。

Test <- as.Date(character(0))
rlang::is_empty(Test)
#[1] TRUE

加载“ tidyverse”包也将加载is_empty()


2
is_empty()也位于purrr
Oliver

7

使用length()方法:

> check <- function(value) {
+ if (length(value)==0) {
+ print('Empty')
+ } else {
+ print('Not Empty')
+ }
+ }
> check("Hello World")
[1] "Not Empty"
> check("")
[1] "Not Empty"
> check(character(0))
[1] "Empty"

6

许多人忘记了诸如str_locate_all()require%>% unlist()%>% .[[1]]

然后,您可以轻松地character(0)通过length()功能检测到if > 0可以安全使用str_locate_all()例如输出。

例:

value <- str_extract_all("kvk :", ascii_digit(8,8)) %>% unlist()
if (length(value) > 0) {
  # Do something
}

1

我解决此问题的方法是仅通过再次将其转换为字符并找到“ character(0)”来处理该列。

例如:

df$interest_column <- as.character(df$interest_column) # Cast it into a character again
df[df$interest_column == "character(0)","interest_column"] <- NA  # Assign new value

我希望这是您要求的解决方案。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.