2016-11-30 12 views
1

In R, I eine Matrix mit matrix() erstellen kann, die die Funktionsdefinition hat:Default-Matrix Anzahl der Spalten und Zeilen in R

function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) 
{ ... } 

Dies legt nahe, dass der Standardwert für die Anzahl der Zeilen (nrow) und Spalten (ncol) sind 1.

Also warum bricht das folgende? Warum führt die Angabe der gleichen Standardwerte 1 zu einer anderen Matrix?

> matrix(1:9) 
     [,1] 
[1,] 1 
[2,] 2 
[3,] 3 
[4,] 4 
[5,] 5 
[6,] 6 
[7,] 7 
[8,] 8 
[9,] 9 

> matrix(1:9, ncol=1, nrow=1) 
    [,1] 
[1,] 1 

Antwort

2

Der Benutzer gerichtete base::matrix ruft ein internal function:

matrix 
# function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) 
# { 
#  if (is.object(data) || !is.atomic(data)) 
#   data <- as.vector(data) 
#  .Internal(matrix(data, nrow, ncol, byrow, dimnames, missing(nrow), 
#   missing(ncol))) 
# } 
# <bytecode: 0x000000000b802e88> 
# <environment: namespace:base> 

Insbesondere ist zu beachten, dass die letzten beiden Argumente an die interne Funktion übergeben Flags anzeigt, wenn die Zeilen- und/oder Spaltendimensionen angegeben wurden : missing(nrow), missing(ncol). Die Tatsache, dass diese Parameter Standardwerte haben, schließt nicht aus, dass sie "fehlen". Zum Beispiel

f <- function(x = 1, y = 2) { 
    cat(sprintf(
     "missing(x): %s\nmissing(y): %s\n", 
     missing(x), 
     missing(y) 
    )) 
} 

f() 
# missing(x): TRUE 
# missing(y): TRUE 

Da die „missing-ness“ dieser Argumente wird dadurch nicht beeinträchtigt, dass sie Standardwerte haben, kann diese Logik unabhängig behandelt werden, wie is done here.

+1

In gewissem Sinne; Ich bin mir nicht sicher, ob "überschreiben" der am besten geeignete Begriff wäre, aber im Wesentlichen sind Standardwerte und "fehlende-Ness" orthogonale Eigenschaften der Argumente. Aus diesem Grund weiß die interne Funktion, ob jedes dieser beiden Argumente tatsächlich angegeben wurde oder nicht, und kann zwischen den beiden Szenarien von ** (A) ** "ncol = 1, nrow = 1" & nicht benutzerdefiniert und unterscheiden ** (B) ** "ncol = 1, nrow = 1" & benutzerdefiniert; auch wenn die 'ncol, nrow' Werte gleich sind. – nrussell

+0

Versehentlich gelöscht mein vorheriger Kommentar. Danke für die Hilfe! – Megatron

Verwandte Themen