2017-03-13 67 views
3

爲向量,矩陣和陣列的工作原理衆所周知的功能dim計算multidemnsional陣列或矩陣的尺寸的尺寸的功能。是否有R中

n = 2 
A = matrix(rnorm(n^2),n,n) 
dim(A) 

按預期得出答案2,2。現在問題往往是你不知道一個對象是一個向量還是一個矩陣或一個數組。 dim只適用於後兩種類型。當然可以寫如下功能

dimVorM = function(x) ifelse(is.vector(x), return(c(1,length(x))), dim(x)) 

但是有沒有更好的方法?

+3

如果有幫助,有'NROW'和'NCOL'函數在矩陣和向量上都有效。 –

+3

所以我會打電話給你的函數'DIM'以保持一致性。 –

回答

3

你可以寫這樣的事情,這將是類似於NROWNCOL

DIM <- function(x) if(is.null(dim(x))) length(x) else dim(x) 

如果只有一個維度,我不會返回長度爲2的向量。並且不要使用ifelse來控制流量。

+0

我會'DIM < - function(x)if(is.null(d < - dim(x)))length(x)else d'來消除對dim()的調用。這將完全等同於'NROW'和'NCOL'。 –

+0

那麼,你正在閱讀一項任務的屬性,所以效率方面,我認爲沒有太大的收穫。 Doig在邏輯測試中的任務雖然很蠢。 –

+0

我剛剛複製了'NROW'和'NCOL'的內部代碼。邏輯測試等內部的這種賦值是在基本R函數的內部代碼中完成的。但我同意R不再使用它曾經基於的經典函數編程範例,所以我不會在腳本中使用它。 –

0

技術上,dim()工程載體。函數dim()提取「dim」屬性並返回其值。一個向量沒有那個屬性dim,所以功能dim()正確地返回NULL

> x <- 1:10 
> attr(x, "dim") <- c(2,5) 
> x 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 3 5 7 9 
[2,] 2 4 6 8 10 
> dim(x) 
[1] 2 5 
> attributes(x) 
$dim 
[1] 2 5 

> dim(x) <- NULL 
> x 
[1] 1 2 3 4 5 6 7 8 9 10 
> dim(x) 
NULL 

dim屬性是針對每個維度中的一個值的向量,表示該維度的元素數。 NROWNCOL都是這樣構建的,他們認爲一個向量是一個列向量,有1列和n行,Hong Ooi的解決方案與此一致。

還要記住,表是完全不同的東西。這不是一個矢量,而是一維數組:

> y <- table(iris$Species) 
> y 

    setosa versicolor virginica 
     50   50   50 
> dim(y) 
[1] 3 
> class(y) 
[1] "table"