这是一个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
> 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.的类型签名。第一个例子有效吗?
答案 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))