2012-01-05 50 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

Right @Joshua,我會考慮將這些添加爲方法 - 但它們可能與類本身的設計相沖突 - 不是技術上的,而是更具哲理性的,如果這是有道理的。現在你可以添加你自己的方法來做你想做的事情。 – 2012-01-05 19:06:48

+0

但是,[.mmap對默認名稱空間不可見,所以必須爲'['調度其他方法。沒有? – aaronjg 2012-01-05 19:07:48

+0

@aaronjg:方法不一定要導出才能註冊。參見'?S3Methods'(特別是Details部分的最後一段)。 – 2012-01-05 19:21:35