2013-07-02 38 views
7

有沒有辦法區分1c(1)?顯然R中如何區分R中元素和長度爲1的向量?

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

+0

這是'rjson'包。在我看來,'toJSON(1)'應該是''1「' – nachocab

+0

'rjson :: toJSON'會檢查長度。即它不會區分'c(1)'和'1' – GSee

回答

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中的向量之間沒有區別 - 不像列表,它總是有一個長度和可以包含任意對象,不一定是相同的類型。

6

號據我所知,有1c(1)

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

rjson::toJSON返回c(1)比它的c(1,2)不同的值的原因是沒有什麼區別,因爲它會檢查的長度並返回不同的長度1對象

1

在R數字只是一個條目的向量。沒有區別。

事實上,一個元素的載體,將自動打印,如果它只是一個標量:

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

如果您的輸出應該對其進行編碼不同,那麼你將不得不這樣做手工,你可以做因爲你的程序正在生成兩者,它知道哪些是「真實」的矢量與具有1個元素的矢量,但是在概念上標量是

相關問題