2012-01-05 8 views
6

mmapパッケージを使用するためにいくつかのコードを移植しようとしています。データフレーム列にアクセスする際に問題が発生しています。R mmapオブジェクトのデータフレーム列にアクセス

$[[演算子を使用してデータ列にアクセスしたいと考えています。ここに私が得ている結果があります。

> foo <- as.mmap(mtcars) 
> foo[,'mpg'] # works 
    mpg 
1 21.0 
2 21.0 
3 22.8 
4 21.4 
5 18.7 
... 
> foo$mpg #does not work 
NULL 
> foo[['mpg']] #also does not work 
NULL 
> foo[]$mpg #works 
... 
> foo[][['mpg']] #also works 
... 

彼らは通常のデータフレームの場合と同様に、メモリマップされたオブジェクト上の$[[オペレーターの仕事をする方法はありますか?

編集: パージョシュアの提案は、私が[[

`[[.mmap` <- function(x,...) `[[`(x[],...) 

のために、特にエレガントなようですが、動作しているようですしない$のための機能を追加しました。

> `$.mmap` <- function(x,...) { 
    if (...%in%c("storage.mode","bytes","extractFUN","filedesc")){ 
    get(...,envir=x) 
    }else { 
    eval(call('$',x[],substitute(...))) 
    }} 

答えて

2

これらの機能にはmmapメソッドがないため機能しません。

> grep("mmap",methods("["),value=TRUE) 
[1] "[.mmap" 
> grep("mmap",methods("[["),value=TRUE) 
character(0) 
> grep("mmap",methods("$"),value=TRUE) 
character(0) 

したがって、彼らはmmapオブジェクトを処理する方法は考えているデフォルトメソッドにディスパッチします。 [[$にはmmapのメソッドを記述する必要があります。

+0

右@ジョシュア、私はこれらをメソッドとして追加することを考えますが、クラス自体の設計と競合する可能性があります。技術的にではなく、理にかなっていればより哲学的に矛盾します。今のところあなたが望むことをする独自のメソッドを追加することができます。 –

+0

しかし、[.mmapはデフォルトの名前空間には表示されません。したがって、他のいくつかのメソッドは '[' 'のために送出されなければなりません。いいえ? – aaronjg

+0

@aaronjg:メソッドをエクスポートする必要はありません。 '?S3Methods'(詳細セクションの最後の段落)を参照してください。 –

関連する問題