NA和字符类型不能在R中混合使用?

时间:2015-09-18 22:44:45

标签: r

这是一个R怪,我只是偶然发现了。如果您使用类型字符(1)进行vapply,并且您应用的函数可能返回NA,则会出现错误:

> vapply(1:2, function(i) if(i == 1) "1" else NA, character(1))
Error in vapply(1:2, function(i) if (i == 1) "1" else NA, character(1)) (from #1) : 
  values must be type 'character',
 but FUN(X[[2]]) result is type 'logical'

然而,vapply很乐意接纳NAs为数字型输出向量

> vapply(1:2, function(i) if(i == 1) 1 else NA, numeric(1))
[1]  1 NA

显然,我们可以使用c

自由混合NA和字符类型
> test <- c("1", NA)
> class(test)
[1] "character"

那是什么给出的?当然,存在琐碎的工作,例如

unlist(lapply(1:2, function(i) if (i==1) 1 else NA))
ifelse(1:2 == 1, 1, NA)

等等。

然而,我不清楚为什么R在第一种情况下决定错误而不是第二种情况。有没有办法改变vapply s.t.的类型签名。第一个例子有效吗?

1 个答案:

答案 0 :(得分:1)

@Frank提供了评论中的关键见解,即每种类型都有自己的NA。因此,第一个示例可以更正为:

vapply(1:2, function(i) if(i == 1) "1" else as.character(NA), character(1))

或等效地:

vapply(1:2, function(i)  if(i == 1) "1" else NA_character_, character(1))