Что не так с этим кодом для расчета углов между векторами в R - PullRequest
0 голосов
/ 28 апреля 2019

Мой ДФ такой:

> dput(df)
structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), x1 = c(173L, 
185L, 190L, 231L, 267L, 185L, 190L, 233L, 260L), y1 = c(299L, 
321L, 360L, 361L, 377L, 321L, 360L, 363L, 309L), x2 = c(260L, 
230L, 230L, 172L, 233L, 230L, 231L, 267L, 260L), y2 = c(309L, 
322L, 322L, 378L, 363L, 322L, 391L, 377L, 309L)), class = "data.frame", 
row.names = c(NA, 
-9L))

> df
  ID  x1  y1  x2  y2
1  1 173 299 260 309
2  1 185 321 230 322
3  1 190 360 230 322
4  2 231 361 172 378
5  2 267 377 233 363
6  2 185 321 230 322
7  3 190 360 231 391
8  3 233 363 267 377
9  3 260 309 260 309

с этими данными я хочу вычислить углы между векторами, используя myfun.

myfun <- function(x1, x2, y1, y2){
  xl <- x2-x1              # array of vectors in X
  yl <- y2-y1              # array of vectors in Y
  cl <- (xl^2 + yl^2)^0.5  
  atang <- atan2(yl, xl)   # angle in radians
  pi <- 3.142857
  angToDeg <- atang * 180/pi  # convert radians to degree
  if(angToDeg < 0){
    angToDeg <- angToDeg + 180
  }
  return(angToDeg)
}

df$ang = myfun(df$x1, df$x2, df$y1, df$y2))

Я получил следующую ошибку:

Warning message:
In if (angToDeg < 0) { :
  the condition has length > 1 and only the first element will be used. 

Как я могу решить эту ошибку? и еще одна вещь, которую я хочу спросить, что правильно использовать 180 в части с условием if (), потому что я видел, как некоторые люди используют 360 вместо 180 следующим образом. Это конкретный случай или как?

  if(angle > 360){
    angle <- angle-360
  }
  return(angle)

Заранее спасибо!

...