2016-04-28 7 views
1

Ich habe eine Funktion erstellt, die ein Raster und eine Matrix erfordert.Jeder Reihe der Matrix enthält die Koordinaten einer Zelle im Raster. Nach meiner Funktion Finishing gibt einen Vektor, der die Anzahl von jeder Zelle enthält, die in meiner Matrix über seinen Koordinaten gespeichert:ersetzen für Schleife mit in R innerhalb einer Funktion anwenden

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) 

} 

Nun möchte Ich mag an meiner Funktion neu strukturieren, so dass ich es mit apply() verwenden können. Also am Ende mag ich in der Lage sein, so etwas wie zu geben:

apply(pts,1,get_cells) 

und das gleiche Ergebnis, aber ich kann nicht herausfinden, wie es zu tun. Jede Art von Hilfe wird sehr geschätzt.

+0

wo hast du 'points_matrix' definiert? – Koundy

+0

habe ich nicht, es ist ein Parameter der Funktion, die ich erstelle und man muss die 'pts'-Matrix beim Aufruf der Funktion zuweisen. Um die Funktion auszuführen, müssen Sie Folgendes eingeben: 'get_cells (r, pts)' – snoops

Antwort

0

Sie können eine Linienfunktion innerhalb der Funktion apply definieren. Versuchen Sie, diese

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

EDIT: @snoops apply tut nimmt auch benutzerdefinierte Funktionen Ihnen gefällt. Ihr Problem besteht darin, dass Sie in Ihrer Funktion zwei Eingabeargumente haben, während Sie in Ihrem Code mit Apply nur ein Argument angeben. Und Sie brauchen keine Schleife innerhalb Ihrer Funktion.

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

Jetzt wird das funktionieren. Sie können andere Argumente Ihrer Funktion innerhalb der Funktion selbst anwenden.

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

Vielen Dank für Ihre Hilfe, Ihr Code hat gut funktioniert. Leider ist das Beispiel, das ich gab, ein vereinfachter Ausschnitt aus einem viel größeren Skript, so dass eine Ein-Zeilen-Funktion für mich nicht funktioniert. Ich wusste nicht, dass 'apply()' nur eine Zeilenfunktion erfordert ... wenn ich das getan hätte, hätte ich nicht gefragt: D Also denke ich, dass ich nach einer anderen Syntax suchen muss. Wie auch immer, nochmals vielen Dank, dass Sie mir geholfen haben! – snoops

+0

genial, vielen Dank :) – snoops

+0

Pls akzeptieren die Antwort und geben Upvote, wenn es funktioniert für Sie :-) – Koundy