有没有办法区分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]"
有任何想法吗?
有没有办法区分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]"
有任何想法吗?
如果您传递一个列表,它会按预期工作:
> 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 的向量之间没有区别 - 与列表不同,列表总是有长度并且可以包含任意对象,不一定是相同类型。
1
不,据我所知,和之间没有区别c(1)
> identical(1, c(1))
[1] TRUE
原因返回与它rjson::toJSON
不同的值是因为它检查长度并为长度为 1 的对象返回不同的值c(1)
c(1,2)
在 R 中,数字只是一个条目的向量。没有区别。
事实上,一个单元素向量会自动打印,就好像它只是一个标量:
a<- 1
str(a) # num 1
b<-c(1)
str(b) # num 1
如果您的输出应该对它们进行不同的编码,那么您将不得不手动执行此操作,您可以这样做,因为您的程序正在生成两者,它知道哪些是“真实”向量与具有 1 个元素但在概念上是标量的向量。