r - NA和字符类型不能在R中混合?

标签 r

这是我刚刚偶然发现的一个 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/

相关文章:

r - "longer object length is not a multiple of shorter object length"

r - 更新 R Shiny 中的 DT 列过滤器选择

r - 积水排序层

检索 BiomaRt 中的 SNP 位置,命令挂起

r - 如何使循环跳过产生警告的输入?

r - 如何将列中的值除以 R 中的特定行?

r markdown - 在编织到 PDF 时如何将表格左对齐而不是居中对齐?

R 如何删除树状图上的标签?

r - 通过累积分组变量将数据框转换为列表

r - 提取 RColorBrewer 调色板用于其他用途