8

有没有办法区分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]"

有任何想法吗?

4

3 回答 3

6

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

> 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 的向量之间没有区别 - 与列表不同,列表总是有长度并且可以包含任意对象,不一定是相同类型。

于 2013-07-02T13:20:51.690 回答
6

1不,据我所知,和之间没有区别c(1)

> identical(1, c(1))
[1] TRUE

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

于 2013-07-02T13:17:52.380 回答
1

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

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

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

如果您的输出应该对它们进行不同的编码,那么您将不得不手动执行此操作,您可以这样做,因为您的程序正在生成两者,它知道哪些是“真实”向量与具有 1 个元素但在概念上是标量的向量。

于 2013-07-02T13:21:05.513 回答