1

2Ddata.frameまたはmatrix1D ベクトルへの自動変換も、一般的な関数を作成する際にいくつかの問題を引き起こします。たとえばfoo、次のようなコマンドを使用して入力の一部の列をフィルタリングしようとするとfoo[,1:3]、 adata.frameまたはに対して正常に機能しmatrixます。

foo=matrix(1:9,nrow=3)
bar = function(x) print(x[,1])
bar(foo) # [1] 1 2 3

しかし、最初に のいくつかの行をフィルタリングしたいと考えてみてfooください。たまたま 1 行しか残っていません。

bar(foo[1,]) # Error in x[, 1] : incorrect number of dimensions

この問題は、次の簡単な方法で解決できます。

bar = function(x) {
    if (is.null(dim(x))) x = t(data.frame(x))
    print(x[,1])
}

xしかし、本体に他のフィルターbar()があり、それが再びベクトルに変換される場合、問題はさらに複雑になります。次に、すべてのフィルタリングについてチェックし、同じことを行って、まだテーブルであることを確認する必要があります。

その他の問題は次のとおりです。マトリックスのフィルター処理された部分が単一の行/列のみの場合、行名や列名が欠落しています。フィルタリングされた部分をマトリックスとして再編成し、元の行/列名を取得して結果のマトリックスに割り当てるには、さらに操作が必要です。

問題は、テーブルで機能する関数を一般的な関数に単純に変換する方法です。入力がたまたまベクトルの場合でも機能しますか?

4

1 に答える 1

1

vector または data.frame の可能性があるデータを操作するときに、同様の問題があります。

通常、関数内にサブセット関数を作成するだけです。

foo <- function(dat,rows) { 

if(is.data.frame(dat) || is.matrix(dat)) { 
dat <- dat[rows,] 
} else {
dat <- dat[rows]

... # continue with function
}

このメソッドは、元のオブジェクトのクラスも維持します。

于 2012-10-23T23:14:38.217 に答える