【问题标题】:Is there a dimension function that works for vectors, matrices and arrays in R是否有适用于 R 中的向量、矩阵和数组的维度函数
【发布时间】:2017-08-03 06:14:37
【问题描述】:

众所周知,函数dim 计算多维数组或矩阵的维数。

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) ) 

但是有更好的方法吗?

【问题讨论】:

  • 如果有帮助,NROWNCOL 函数可用于矩阵和向量。
  • 所以我会调用你的函数DIM 以保持一致性。

标签: arrays r matrix vector


【解决方案1】:

你可以这样写,类似于NROWNCOL

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

如果某物只有一维,我不会返回长度为 2 的向量。并且不要将ifelse 用于控制流。

【讨论】:

  • 我会使用DIM &lt;- function(x) if(is.null(d &lt;- dim(x))) length(x) else d 来消除对dim() 的调用。这将完全等同于NROWNCOL
  • 嗯,你正在权衡阅读一个任务的属性,所以效率方面我认为没有太多收获。不过,在逻辑测试中做作业是很笨拙的。
  • 我刚刚复制了NROWNCOL的内部代码。逻辑测试等内部的分配是在基本 R 函数的内部代码中完成的。但我同意 R 摆脱了它曾经基于的经典函数式编程范式,所以我自己不会在脚本中使用它。
【解决方案2】:

从技术上讲,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"

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 2015-11-17
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2015-12-14
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多