3

次元 1 または 2 の引数 x を取る関数があるとします。次のようなことをしたいと思います。

x[1, i]

ベクトルまたは行列 (または 1 つまたは 2 つの変数のテーブル) を取得したかどうかに関係なく。

例えば:

x = 1:5
x[1,2] # this won't work...

もちろん、どのクラスが引数として与えられたかを確認したり、引数を強制的に行列にすることはできますが、私はむしろそれをしたくありません。たとえば、Matlab では、ベクトル1 次元を除くすべての次元がサイズ 1 の行列です (行または列などとして扱うことができます)。これにより、コードが適切で規則的になります。

また、R ベクトル (または一般的には 1 次元オブジェクト) が行列 (または多次元オブジェクト) の特殊なケースではない理由を知っている人はいますか?

ありがとう

4

1 に答える 1

5

Rでは、その逆です。行列はベクトルです。マトリックスのような動作は、オブジェクトのアトミックベクトル部分の上にあるいくつかの追加の属性に由来します。

dim()必要な動作を得るには、または明示的な強制を使用してベクトルに次元を設定することにより、ベクトルを行列にする必要があります。

> vm <- 1:5
> dim(vm) <- c(1,5)
> vm
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
> class(vm)
[1] "matrix"

次に、サブセット化するときに寸法を維持する必要があります。デフォルトでは、Rは空のディメンションをドロップしますvm。上記の場合は行のディメンションです。drop = FALSEの呼び出しで使用してそれを行います'['()。デフォルトの動作は次のdrop = TRUEとおりです。

> vm[, 2:4]
[1] 2 3 4
> vm[, 2:4, drop = FALSE]
     [,1] [,2] [,3]
[1,]    2    3    4

行列にクラスを追加し[、引数がデフォルトdropで設定されているそのクラスのメソッドを作成できます。FALSE

class(vm) <- c("foo", class(vm))
`[.foo` <- function(x, i, j, ..., drop = FALSE) {
  clx <- class(x)
  class(x) <- clx[clx != "foo"]
  x[i, j, ..., drop = drop]
}

使用中は次のようになります。

> vm[, 2:4]
     [,1] [,2] [,3]
[1,]    2    3    4

つまり、空の次元を維持します。

これを誰にでもできるように普及させるには、さらに多くの努力が必要になりますが、上記の方法で始めることができます。

于 2012-12-11T17:15:14.920 に答える