2014-05-25 72 views
0

我想在兩個柵格之間應用相對簡單的「柵格數學」計算。我似乎無法弄清楚如何在我的函數中正確設置NA值。我到處尋找答案,並嘗試了幾種不同的方法來解決這個問題,但無濟於事。柵格計算功能 - 與NA數據問題

library(raster) 

#Edited with feedback 
fun.calc <- function(x, y, ...) 
{ 
tree.w <- sum(x/(100 - y), ...) 
ifelse(is.na(x) | is.na(y), NA, tree.w) 
} 

r1 <- raster(nrow=50, ncol = 50) 
r1[] <- 90 
r1[4:10,] <- NA 
r2 <- raster(nrow=50, ncol = 50) 
r2[] <- 40 
r2[9:15,] <- NA 

#Try UPDATED 
fun.calc(r1[,,1], r2[,,1], fun=fun.calc, na.rm=TRUE) 

這不會引發錯誤,但我沒有得到正確的值,在沒有NA值的地方應該是1.5(我得到2850)。我不明白爲什麼這樣做,但我想它與光柵中的矢量有關。

感謝您的想法!

+0

函數'raster()'來自哪裏。請在代碼中包含所有必需的庫。 – MrFlick

+0

對不起@MrFlick編輯! – user3367135

回答

0

好像我不得不這樣做是爲了得到一個解決這個答案。我不明白爲什麼除了這似乎工作。如果有人有更好的答案,那會很好。

fun.calc1 <- function(x, y, ...) 
{ 
tree.w <- sum(x/(100 - y), ...) 
length.xy <- length(which(!is.na(x) & !is.na(y))) 
ifelse(is.na(x) | is.na(y), NA, tree.w/length.xy) 
} 

fun.calc1(r1[1:length(r1)],r2[1:length(r2)], na.rm=T) 

再一次,不知道它爲什麼會起作用,但我確實得到了1.5的正確答案。

1

馬上我可以告訴你,fun.calc1應該重寫成類似於我下面的內容。你有太多的return陳述,事實上你根本不需要他們。您也沒有將...參數傳遞給該函數。我也不太明白爲什麼你想要na.rm = TRUE如果你想NA返回,如果它在xy

fun.calc1 <- function(x, y, ...) 
{ 
    tree.w <- sum(x/(100 - y), ...) 
    ifelse(is.na(x) | is.na(y), NA, tree.w) 
} 

屈服

> fun.calc1(5, 10) 
# [1] 0.05555556 
> fun.calc1(5, NA, na.rm = TRUE) 
# [1] NA 

這是一樣的

fun.calc3 <- function(x, y) sum(x/(100 - y)) 

> fun.calc1(5, 10) 
# [1] 0.05555556  
> fun.calc3(5, NA) 
# [1] NA 
+0

是的,@Richard Scriven我還在學習功能!我發現第一個與矢量示例數據一起工作,但是使用柵格示例,我得到以下錯誤: .calcTest(x [1:5],fun,na.rm,forcefun,forceapply)中的錯誤: 無法使用此功能。也許在函數參數中加入'...'或'na.rm'? – user3367135