2Ddata.frame
またはmatrix
1D ベクトルへの自動変換も、一般的な関数を作成する際にいくつかの問題を引き起こします。たとえば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()
があり、それが再びベクトルに変換される場合、問題はさらに複雑になります。次に、すべてのフィルタリングについてチェックし、同じことを行って、まだテーブルであることを確認する必要があります。
その他の問題は次のとおりです。マトリックスのフィルター処理された部分が単一の行/列のみの場合、行名や列名が欠落しています。フィルタリングされた部分をマトリックスとして再編成し、元の行/列名を取得して結果のマトリックスに割り当てるには、さらに操作が必要です。
問題は、テーブルで機能する関数を一般的な関数に単純に変換する方法です。入力がたまたまベクトルの場合でも機能しますか?