2013-07-17 77 views
1

我想用一個包含函數與矩陣mapply使用mapply使用的,如果是這樣的:符合條件

dim_rf <- 10 

rf <- matrix(runif(dim_rf*dim_rf),ncol=dim_rf) 


fire_rf <- function(i,j) { 
    if(rf[i,j+1] + rf[i+1,j] + rf[i,j-1] + rf[i-1,j]>1) 
    rf[i,j] <-2 
} 

mapply(fire_rf, row(rf), col(rf) ) 

,但它給出了一個錯誤

Error en if (rf[i, j + 1] + rf[i + 1, j] + rf[i, j - 1] + rf[i - 1, j] > : 

參數長度爲零

我怎麼能修改功能,使其工作?

我用這個做火滲透的一個簡單的模型,因此需要快速,因爲100或1000

+0

您應該增加像一些條件'如果(I> 1&J> 1&I agstudy

+0

當'j'或'i'是'1',您嘗試使用子集零爲索引元素'rf'。當'j'或'i'是等於最大列或行號,該索引也最終被'rf'之外。這在「if」語句中作爲錯誤結束。所以不要在'mapply'迭代中包含這些「邊緣」情況。 – BenBarnes

+0

代碼的點是產生副作用。因此,只需使用'for'循環即可。 –

回答

1

這將幫助您調試功能:

fire_rf <- function(i,j) { 
    print(paste(i, j)) 
    print(paste(rf[i,j+1], rf[i+1,j], rf[i,j-1], rf[i-1,j])) 
} 

R> mapply(fire_rf, row(rf), col(rf)) 
[1] "1 1" 
[1] "0.431833460461348 0.723794676829129 " 
[1] "2 1" 
[1] "0.61886831978336 0.764425948029384 0.486255120486021" 
[1] "3 1" 
[1] "0.98786562983878 0.416759668383747 0.723794676829129" 
[1] "4 1" 
[1] "0.516932599013671 0.66259386530146 0.764425948029384" 
[1] "5 1" 
[1] "0.770237588090822 0.844016372924671 0.416759668383747" 
[1] "6 1" 
[1] "0.519682829733938 0.273759116884321 0.66259386530146" 
[1] "7 1" 
[1] "0.0957026474643499 0.32785635185428 0.844016372924671" 
[1] "8 1" 
[1] "0.380909610772505 0.164877543691546 0.273759116884321" 
[1] "9 1" 
[1] "0.509409713326022 0.614429801469669 0.32785635185428" 
[1] "10 1" 
Error in rf[i + 1, j] : subscript out of bounds 
Calls: mapply -> <Anonymous> -> print -> paste 

你看,而你認爲​​你傳遞的參數,有時你是不是有時候你逝去的不止是存在的。你需要考慮那些 '我 - 1', '的J - 1' 和 'I + 1' 和 'J + 1'。如果你真的想這樣做,我建議你寫一個簡單的循環。

2

我猜,這就是你想要的矩陣的大小應大。你的循環條件是錯誤的,使算法超出界限。

dim_rf <- 10 
rf <- matrix(runif(dim_rf*dim_rf),ncol=dim_rf) 
fire_rf <- function(i,j) { 
    if((rf[i,j+1] + rf[i+1,j] + rf[i,j-1] + rf[i-1,j])>1) 
     rf[i,j] <<-2 
} 
mapply(fire_rf, 2:(nrow(rf)-1), 2:(ncol(rf)-1)) 

希望這會有所幫助。 :)

PS。另請注意,我將本地分配更改爲全局分配。如果這不是你想要的,你可以把它改回來。