2013-07-02 9 views
7

Gibt es eine Möglichkeit, zwischen 1 und c(1) zu unterscheiden? Offenbar in RWie unterscheidet man zwischen einem Element und einem Vektor der Länge 1 in R?

c(1) == 1 # TRUE 
as.matrix(c(1)) == 1 # TRUE 
as.array(c(1)) == 1 # TRUE 

was ein Problem ist, zum Beispiel, wenn ich einen Vektor zu JSON bin Umwandlung:

library(rjson) 
toJSON(c(1,2)) # "[1,2]" 
toJSON(c(1)) # "1" instead of "[1]" 

Irgendwelche Ideen?

+1

Ist das mit dem 'RJSONIO' Paket? Ich bekomme "[1]" für beide "toJSON (1)" und "toJSON (c (1))" – GSee

+0

Es ist das 'rjson'-Paket. Meiner Meinung nach sollte "toJSON (1)" '' 1 "' – nachocab

+0

sein. 'Rjson :: toJSON' prüft die Länge. h. es unterscheidet nicht zwischen "c (1)" und "1". – GSee

Antwort

5

Es funktioniert wie erwartet, wenn Sie eine Liste übergeben:

> toJSON(list(1)) 
[1] "[1]" 

können Sie mit as.list konvertieren:

> toJSON(as.list(c(1))) 
[1] "[1]" 
> toJSON(as.list(c(1, 2))) 
[1] "[1,2]" 

Wie in den anderen Antworten erwähnt, gibt es keinen Unterschied zwischen einem atomaren Wert und einem Vektor der Länge eines in R - anders als bei Listen, die immer eine Länge aufweisen und kann beliebige Objekte enthalten, nicht notwendigerweise vom selben Typ.

6

Nr Soweit ich weiß, gibt es keinen Unterschied zwischen 1 und c(1)

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

Der Grund rjson::toJSON einen anderen Wert für c(1) zurück, als es für c(1,2) tut, ist, weil sie die Länge und kehrt anders prüft für 1 Länge Objekte

1

In R Zahlen sind nur Vektoren eines Eintrags. Es gibt keinen Unterschied.

In der Tat, ein Ein-Element-Vektor wird automatisch gedruckt, als ob es nur ein Skalar war:

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

Wenn Ihr Ausgang sie anders kodieren sollte, dann werden Sie manuell das tun müssen, was Sie tun können, Da Ihr Programm beide erzeugt, weiß es, welche "realen" Vektoren vs. Vektoren sind, die 1 Element haben, aber konzeptionell skalar sind.

Verwandte Themen