如何区分R中长度为1的元素和向量?

时间:2013-07-02 13:09:05

标签: r

有没有办法区分1c(1)?显然在R

c(1) == 1 # TRUE
as.matrix(c(1)) == 1 # TRUE
as.array(c(1)) == 1 # TRUE

这是一个问题,例如,如果我将矢量转换为JSON:

library(rjson)
toJSON(c(1,2)) # "[1,2]"
toJSON(c(1)) # "1" instead of "[1]"

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

没有。据我所知,1c(1)

之间没有区别
> identical(1, c(1))
[1] TRUE

rjson::toJSONc(1)返回的值与c(1,2)不同的原因是因为它检查长度并对长度为1的对象返回不同

答案 1 :(得分:5)

如果您传递列表,它会按预期工作:

> toJSON(list(1))
[1] "[1]"

您可以使用as.list转换:

> toJSON(as.list(c(1)))
[1] "[1]"
> toJSON(as.list(c(1, 2)))
[1] "[1,2]"

如其他答案中所述,R中的原子值和长度为1的向量之间没有区别 - 与列表不同,列表总是具有长度并且可以包含任意对象,不一定是相同类型。

答案 2 :(得分:1)

在R中,数字只是一个条目的向量。没有区别。

实际上,单元素向量会自动打印,就好像它只是一个标量:

a<- 1
str(a)          # num 1
b<-c(1)
str(b)          # num 1

如果您的输出应该以不同方式编码,那么您必须手动执行此操作,您可以执行此操作,因为您的程序同时生成两者,它知道哪些是“真实”向量与具有1个元素但是的向量概念上标量。