2014-01-13 36 views
1

簡單的算術運算工作與小柵格預期,例如:在R中添加大型柵格時,@ data @值會發生什麼?

> r1 <- raster(ncol=5, nrow=5) 
> r1[] <- rep(1, 5 * 5) 
> class([email protected]@values) 
[1] "numeric" 
> class((r1 + r1)@[email protected]) 
[1] "numeric" 

但是,當我用更大的柵格,奇怪的事情發生了:

> r1 <- raster(ncol=5000, nrow=5000) 
> r1[] <- rep(1, 5000 * 5000) 
> r2 <- r1 + r1 
> class([email protected]@values) 
[1] "logical" 

爲什麼[email protected]@values成爲logical? 該所得目的是在隨後的計算中,不可用的 和一般它的行爲出現異常,例如:

> summary([email protected]@values) 
    Min. 1st Qu. Median Mean 3rd Qu. Max. 
     1  1  1  1  1  1 
> summary([email protected]@values) 
    Mode NA's 
logical  0 
> object.size(r1) 
200011576 bytes 
> object.size(r2) 
12112 bytes 

基本上r2看起來破碎。

作爲一種變通方法,加入@[email protected]似乎很好地工作:

> r3 <- r1 
> [email protected]@values <- [email protected]@values * 2 
> class([email protected]@values) 
[1] "numeric" 

但你怎麼能解釋這種行爲,只有擁有較大的柵格發生什麼呢?

回答

3

logical是因爲raster對象指向存儲實際值的磁盤上的臨時文件,而不是將25,000,000個數值存儲在內存中。這些值完全可用於後續的算術方法。使用@[email protected]插槽來設置值需要麻煩。使用提供的算術方法或使用setValues()函數。

這在?Arith-methods幫助頁面中詳細說明:

如果輸出柵格*的值不能在內存中舉行,他們將被保存到一個臨時文件。您可以使用選項來設置默認文件格式,數據類型和進度欄。

鑑於上面的對象r2,您可以像存儲在內存中的對象那樣使用它。這是raster所做的很多事情之一 - 它可以與存儲在磁盤上的文件無縫協作,就像它們是常規的內存中對象一樣。

r3 <- r2^2 
r3 
#class  : RasterLayer 
#dimensions : 5000, 5000, 2.5e+07 (nrow, ncol, ncell) 
#resolution : 0.072, 0.036 (x, y) 
#extent  : -180, 180, -90, 90 (xmin, xmax, ymin, ymax) 
#coord. ref. : +proj=longlat +datum=WGS84 
#data source : /private/var/folders/ck/1x5j5jvx5mq17clf5r32gg540000gn/T/R_raster_tmp/Simon/raster_tmp_2014-01-13_214043_710579.grd 
#names  : layer 
#values  : 4, 4 (min, max) 

注層的值被正確地返回爲4,即2^2

+0

謝謝,但你如何解釋我的結果'摘要(r2 @ data @ values)'?我也不能做像'head()'這樣的事情,而其他訪問這些值的方法不起作用。 – janos

+1

你需要做'head(r2 [],10)'。您需要使用'[]'來返回值。 「摘要」結果是因爲您正在爲磁盤上的每個值獲取邏輯。你*應該*做'摘要(r2)'。有關更多詳細信息,請參閱'?raster :: summary'。爲'柵格'對象寫明確的彙總方法。同樣,不要直接訪問插槽。作者不保證如何通過這些值來改變值,因此提供了訪問函數。始終使用這些。 –

+0

這很聰明。不幸的是,如果我將這個對象保存到一個'.RData'文件並稍後加載它,它就不再工作了。看起來像存儲數據的臨時文件會丟失。有沒有辦法保存柵格,以便以後可以安全地加載它?或者有沒有辦法禁用臨時文件?在我的例子中,我的對象是200MB,不小,但在我的PC上,這不是問題。 – janos

相關問題