2012-10-05 6 views
6

Bei der Unterteilung von Arrays verhält sich R anders, je nachdem, ob eine der Dimensionen die Länge 1 hat oder nicht. Wenn eine Dimension Länge 1 hat, wird diese Dimension bei subsetting verloren:Subsetting R-Array: Dimension verloren, wenn seine Länge 1 ist

ax <- array(1:24, c(2,3,4)) 
ay <- array(1:12, c(1,3,4)) 
dim(ax) 
#[1] 2 3 4 
dim(ay) 
#[1] 1 3 4 
dim(ax[,1:2,]) 
#[1] 2 2 4 
dim(ay[,1:2,]) 
#[1] 2 4 

Aus meiner Sicht ax und ay die gleichen sind, und die Durchführung der gleichen Teilmenge Operation an ihnen sollte ein Array mit den gleichen Abmessungen zurückkehren . Ich kann sehen, dass die Art, wie R die beiden Fälle behandelt, nützlich sein könnte, aber in dem Code, den ich schreibe, ist es unerwünscht. Das bedeutet, dass wenn ich ein Teilmengen-Array an eine andere Funktion übergebe, die Funktion ein Array mit einer fehlenden Dimension erhalten würde, wenn ich eine Dimension zu einem früheren Zeitpunkt auf die Länge 1 reduzieren würde. (In diesem Fall macht die Flexibilität von R meinen Code weniger flexibel!)

Wie kann ich verhindern, dass R während der Teilmenge eine Dimension der Länge 1 verliert? Gibt es eine andere Möglichkeit der Indexierung? Einige Flagge zu setzen?

+0

nicht identisch, aber vielleicht von Interesse: http://stackoverflow.com/questions/12196724/generally-disable-dimension-dropping-for-matrices –

Antwort

14

Wie Sie in der Standardeinstellung herausgefunden haben, löscht R unnötige Dimensionen. Hinzufügen drop=FALSE während Indizierung dies verhindern kann:

> dim(ay[,1:2,]) 
[1] 2 4 
> dim(ax[,1:2,]) 
[1] 2 2 4 
> dim(ay[,1:2,,drop = F]) 
[1] 1 2 4 
+0

Danke, Dason. Perfekt. Ich hätte nicht gedacht, dass du es so machen könntest. (Ich wusste, dass es eine FAQ war, aber es ist schwierig, eine nützliche Suchzeichenfolge für eine Antwort zu konstruieren.) – Mars

+0

Folgefrage: Wie kann ich diese Syntaxinformationen vom integrierten Hilfesystem erhalten? – Mars

+0

'?" ["" Sollte funktionieren. Oder 'help (" [")'. – Dason

Verwandte Themen