有没有办法区分1
和c(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]"
有什么想法吗?
答案 0 :(得分:6)
没有。据我所知,1
和c(1)
> identical(1, c(1))
[1] TRUE
rjson::toJSON
为c(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个元素但是的向量概念上标量。