-1

私が R にあればと心から願っている機能の 1 つは、仮想ベクトルと仮想行列です。これらはストレージを持たないが、実際にはメンバをジャスト イン タイムで計算する関数へのインターフェイスです。

このような機能の 1 つのアプリケーションは、距離メトリックの計算が安価な多数のアイテムを階層的にクラスタリングすることです。現在dist、すべての距離がメモリに保存されているため、最大 20,000 個のアイテムを分類するために使用できます。でももっとやりたい。hclustユーザーは dist 行列を提供できるため、このような関数を使用すると、メモリ制限を回避できます。

関連するがあまり一般的ではない機能は、ファイル マップされたベクトルと行列です。つまり、ファイルを仮想メモリとして使用します。

これを行うパッケージはありますか?1つ書くのは簡単でしょうか?これを自分で実装したい場合は、どこから始めればよいですか?

4

1 に答える 1

1

R には、変数のように見える何かのためのいくつかの機能がありますが、舞台裏の関数です (アクティブ バインディングと呼ばれます)。

> makeActiveBinding("rand.x", function(...) rnorm(1,100,10), .GlobalEnv)
> rand.x
[1] 94.1004
> rand.x
[1] 109.3716

(ただし、これを使用する場合は十分に注意してください。コードがわかりにくくなり、バグを追跡するのが難しくなります)

@Peyton で言及されているように、オンザフライで計算されるサブセット化メソッドを使用してオブジェクト タイプを作成することもできます。

コメントで指摘されたように、大きなデータ オブジェクトをディスクに格納する ff のようなパッケージがありますが、メモリ内にあるかのようにアクセスできます。

ただし、これらのどれも、あなたが説明したことを達成する可能性は低い. agnesクラスター ライブラリのような関数は、オブジェクト (または関数を 1 回実行した結果) のコピーを効果的に作成するdata.tableorのような別の関数に引数を渡します。as.distしたがって、ff オブジェクトはメモリに完全にロードされ、アクティブなバインディングまたは[メソッドが一度呼び出されてマトリックス全体が作成され、それ以降はそのコピーが使用されます。

この機能が本当に必要な場合 (そして確かにその使用方法を確認できます)、クラスター (またはその他の) 関数を書き直して、データまたは距離行列の代わりに関数を受け入れるようにすることをお勧めします。関数をそのまま使用して、不要な部分を取り除き、データから抽出する部分を距離情報を提供する関数の呼び出しに変更することができます。

于 2013-07-19T16:03:03.277 に答える