Замените цикл на применить в 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)
Другие вопросы по тегам