Замените цикл на применить в 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)
и получить тот же результат, но я не могу понять, как это сделать. Любая помощь высоко ценится.
1 ответ
Вы можете определить одну строковую функцию внутри apply
функция. Попробуй это
apply(pts,1,function(x) return(cellFromXY(raster,x)))
РЕДАКТИРОВАТЬ:
@snoops apply
действительно принимает пользовательские функции, также как и ваши. Ваша проблема в том, что у вас есть два входных аргумента в вашей функции, в то время как ваш код с apply вы предоставляете только один аргумент. И вам не нужен цикл внутри вашей функции.
get_cells <- function(x,raster) {
Cells <- cellFromXY(raster,x)
return(Cells)
}
Теперь это будет работать. Вы можете дать другие аргументы своей функции внутри самой функции apply следующим образом.
apply(pts,1,getCells,raster = r)