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

9

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

任何想法吗?

1
这是使用 RJSONIO 包吗?我对 toJSON(1)toJSON(c(1)) 都得到了 "[ 1 ]"。 - GSee
这是rjson包。在我看来,toJSON(1)应该是"1" - nachocab
rjson::toJSON 检查长度。即它不区分 c(1)1 - GSee
在 R 中,c(1)1 是完全相同的,因此您无法区分它们。 - kohske
3个回答

6
据我所知,1c(1)之间没有区别。
> identical(1, c(1))
[1] TRUE
< p > rjson::toJSON 返回c(1)c(1,2)不同的值是因为它检查长度并针对长度为1的对象返回不同的值。


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
在R中,数字只是一个元素的向量。没有区别。
事实上,一个单元素的向量会自动被打印成一个标量:
a<- 1
str(a)          # num 1
b<-c(1)
str(b)          # num 1

如果您的输出应该以不同的方式对它们进行编码,那么您将需要手动进行操作。这是因为您的程序正在生成两者,它知道哪些是“真正”的向量,而哪些是只有一个元素但在概念上是标量的向量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接