R:从函数创建一个im对象作为我模型的协变量

时间:2017-05-23 21:56:44

标签: r spatstat

我想从一个函数创建一个im对象,该函数根据相对于固定线的距离分配一个值,即如果该点远离该线,则其值接近于零,如果该值接近于该值则相反线。我创建了以下功能:

var predicate = PredicateBuilder.False<infotable>();
foreach (var tuple in tuples)
{
   var item1 = tuple.Item1;
   var item2 = tuple.Item2;
   predicate = predicate.Or(t => t.Item1 == item1 && t.Item2 == item2);
}

var result = Context.infotable.Where(predicate).ToList();

该功能正常,现在我尝试创建im对象:

library(spatstat)

W <- owin(xrange = c(-0.5, 4.5), yrange = c(-0.5, 3.5))

covValue <- function(x, y) {
  # defining the segment AB
  b <- W$yrange[2] + 2
  A <- c(W$xrange[1], b)
  I <- c(W$xrange[2], W$yrange[2])
  m <- (I[2] - A[2]) / (I[1] - A[1])
  B <- c((W$yrange[1] - b) / m, 0)

  C <- c(x, y)

  C <- c(4.5, 3.5)
  x1 <- A[1]
  y1 <- A[2]
  x2 <- B[1]
  y2 <- B[2]
  x3 <- C[1]
  y3 <- C[2]

  # calculating the orthogonal point D that belongs to the segment AB with respect to a given point C = (x,y) inside the observation window

  px  <- x2 - x1
  py  <- y2 - y1
  dAB <- px * px + py * py
  u   <- ((x3 - x1) * px + (y3 - y1) * py) / dAB
  xr   <- x1 + u * px
  yr   <- y1 + u * py

  D <- c(xr, yr)
  # t<-((C[1]-A[1])*(B[1]-A[1])+(C[2]-A[2])*(B[2]-A[2]))/((B[1]-A[1])^2+(B[2]-A[2])^2)
  # Dx=A[1]+t*(B[1]-A[1])
  # Dy=A[2]+t*(B[2]-A[2])

  # if the point C is away from the segment AB, this has less value
  dist  <- sqrt((C[1] - D[1]) ^ 2 + (C[2] - D[2]) ^ 2)
  value <- 1 / exp(dist)
  return(value)
}

我收到此错误:

  

错误:长度(mat)==长度(xcol)*长度(yrow)不为TRUE

有人可以帮助我,谢谢。

1 个答案:

答案 0 :(得分:0)

必须对函数进行矢量化,使得对于长度为n的向量x和y,它必须返回长度为n的向量。如果您只需要到线段的距离,您可以创建一个psp对象并在其上使用distfun。现在在机场,所以我无法填写详细信息。