2013-10-25 4 views
1

Мой вопрос заключается в том, как вычислить угол между двумя растровками в R? Вот пример воспроизводимых и Я получаю ошибку:вычислить угол между двумя растрами

angle <-function(vectora, vectorb){ 
     theta <- acos(sum(vectora*vectorb)/(sqrt(sum(vectora * vectora)) * sqrt(sum(vectorb * vectorb)))) 
} 

raster1 <- raster(ncols=150, nrows=150, xmn=0) 
raster1[] <- rnorm(150*150,ncell(1)) 
raster2 <- raster(ncols=150, nrows=150, xmn=0) 
raster2[] <- rnorm(150*150,ncell(2)) 

r.angle <- overlay(raster1,raster2, filename='tes.tif',fun=function(x,y){angle(x,y)}) 

Сообщение об ошибке выглядит следующим образом:

Error in (function (x, fun, filename = "", recycle = TRUE, ...) : 
    cannot use this formula, probably because it is not vectorized 

Как я могу получить, что векторизованную?

+1

Может быть, если вы добавите 'возврат (тэта)' заявление в вашей функции и применить 'angle' как r.angle <- overlay (растер1, растер2, имя_файла = 'tes.tif', fun = function (x, y) {mapply (angle, x [], y [])}) '? Кроме того, на моем компьютере мне пришлось сменить имя файла на 'tes.tiff', чтобы просмотреть файл. –

+0

благодаря этому заставляет его работать – WAF

ответ

1

Как и в комментарии, изменение двух вещей устранит проблему. Векторизация происходит через raster1 [] и raster2 [], поэтому вам нужно изменить приложение функции.

function(x,y){angle(x[],y[])}) 

и добавить возвращение в конце угла функции():

return(theta) 
Смежные вопросы