2016-04-28 10 views
1

ラスタと行列を必要とする関数を作成しました。行列のすべての行は、ラスタ内のセルの座標を保持します。forループを関数内のRで適用すると置換する

library(raster) 
library(gdistance) 
r <- raster(nrow=100,ncol=15) 
r[] <- 1:ncell(r) 
plot(r) 
pts <- matrix(c(-144,72.9,-168,45.9,-144,13.5),ncol=2,nrow=3,byrow=TRUE) 

get_cells <- function(raster,points_matrix) { 
Cells <- c() 
for (i in 1:nrow(points_matrix)) 
    { 
    Cells[i] <- cellFromXY(raster,c(points_matrix[i,])) 
    } 
    return(Cells) 

} 

は今、私はapply()で使用できるように、私の機能を再構築したいと思います:私の機能を終えた後、それの座標を経て、私の行列に保存されているすべてのセルの数を含むベクターを返します。 だから最後に私のようなものを入力することができるようにしたい:

apply(pts,1,get_cells) 

をして同じ結果を得るが、私はそれを行う方法を見つけ出すことはできません。 どんな種類のヘルプがあれば幸いです。

+0

どこで 'points_matrix'を定義しましたか? – Koundy

+0

私は作成した関数のパラメータであり、関数を呼び出すときに 'pts' -matrixを代入する必要があります。したがって、fuctionを実行するには、 'get_cells(r、pts)'とタイプする必要があります。 – snoops

答えて

0

apply機能内に1つの回線機能を定義できます。この

apply(pts,1,function(x) return(cellFromXY(raster,x))) 

EDITしてみてください。applyはありません @snoopsをもあなたのようなユーザー定義関数を取ります。あなたの問題は、関数内に2つの入力引数があり、コードを適用すると1つの引数しか与えられないということです。そして、関数内にループは必要ありません。

get_cells <- function(x,raster) { 
    Cells <- cellFromXY(raster,x) 
    return(Cells) 
} 

これで動作します。このように関数自身の内部で関数の他の引数を与えることができます。

apply(pts,1,getCells,raster = r) 
+0

あなたの助けをいただき、ありがとうございます。残念ながら、私が与えた例は、はるかに大きなスクリプトを簡略化した抜粋であるため、1行の関数は私のためには機能しません。私は 'apply()'がたった1行の関数しか取らないことを知りませんでした...もし私がしたら、私は尋ねなかったでしょう:D私は別の構文を探す必要があるでしょう。とにかく、もう一度私を助けてくれてありがとう! – snoops

+0

awesome、ありがとうたくさん:) – snoops

+0

Plsは答えを受け入れて、それがうまくいくなら:up)、 – Koundy

関連する問題