这是我刚刚偶然发现的一个 R 怪事。如果您使用类型 character(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 会很乐意将 NA 纳入数字类型输出向量
> 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 st 的类型签名?第一个例子有效吗?
最佳答案
@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))
关于r - NA和字符类型不能在R中混合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32662103/