R Lapply PointsOnLines через список объектов psp

Теперь, когда я успешно, благодаря @Phil, преобразовал мой SpatialLinesDataFrame в список объектов psp, мне нужно использовать функцию SpatStat pointsOnLines для создания точек вдоль каждого элемента списка (например, линии) и иметь отметки линия переносится на каждый набор точек.

Я новичок в lapply, но, видя, как он использовался при преобразовании пространственного кадра данных в список объектов psp, я считаю целесообразным использовать его для применения функции pointsOnLines к каждому списку? Увы, у меня это не работает. Помощь!

Продолжая обычный пример ....

library("maptools")
library("rgdal")
library("spatstat")

base_dir <- system.file("shapes", package = "maptools")
fylk <- readOGR(base_dir, "fylk-val")

is(fylk)

out <- lapply(fylk@lines, function(i) { lapply(i@Lines, as.psp) })
out

dat <- fylk@data
for (i in seq_along(1:nrow(dat))) {
  out[[i]] <- lapply(out[[i]], "marks<-", value = dat[i, , drop = FALSE])
}

for(i in seq_along(out)){
  abc[[i]]<-(lapply(out[[i]],function(i){pointsOnLines(out[[i]],eps=10)}))
}

Это не работает, и я не могу понять, почему. Я использовал [[]] как список списков?

Предложения новичку?


person Aber_R    schedule 27.11.2019    source источник
comment
Это не работает ... нам никогда не поможет. Что это за ошибка или нежелательный результат? Я вижу, что вы никогда не инициализируете abc и передаете out[[i]] внутри анонимной функции. Помните, что i становится объектом, который будет использоваться при передаче в function(). Кроме того, вы повторно используете i в циклах for и lapply.   -  person Parfait    schedule 27.11.2019
comment
Вы усложняете себе жизнь больше, чем это необходимо. Обратитесь к моему ответу на ваш предыдущий вопрос и превратите строки в linnet. Тогда у вас будет прямой доступ к функциям spatstat для создания точек в сети и т. Д. Посмотрите на функции, которые называются чем-то с помощью lpp, и строки в spatstat. Лучшая справочная информация - это глава 17 книги spatstat. Пишу с телефона, поэтому не могу найти для вас все имена. Посмотрите файлы справки для linnet и lpp и ссылки на другие функции в них. Удачи.   -  person Ege Rubak    schedule 27.11.2019
comment
@EgeRubak Объект класса linnet представляет собой сеть из отрезков прямых линий в двух измерениях. У меня не прямые отрезки, а очень извилистые дуги. Поэтому я не думаю, что ваше предложение мне поможет. Я ошибся?   -  person Aber_R    schedule 27.11.2019
comment
@Parfait Ваше право, я сообщу полученную ошибку в будущем. Я новичок в R и самоучка, так что это крутая кривая обучения. Приведенное ниже решение действительно сработало, но это не был желаемый результат. Мне нужен объект psp точек вдоль линий, содержащихся в объекте списка. код ошибки, который я получаю, когда запускаю предоставленный вами код, а затем пытаюсь построить график, результат таков ..._ 1_   -  person Aber_R    schedule 28.11.2019
comment
Psp и объект SpatialLines также являются просто отрезками прямых линий, например linnet. Вы можете представлять в этих классах одни и те же линии. Преимущество линнета заключается в том, что он знает, какие сегменты соединяются на перекрестках, и позволяет путям переходить от одного сегмента к другому. Обычно изогнутые дуги представлены множеством небольших прямых линий, склеенных вместе. Они могут быть представлены всеми тремя классами. Если у вас действительно изогнутые дуги, не представленные набором прямых линий, вам не повезло с чем-либо в spatstat (и R в целом, я считаю).   -  person Ege Rubak    schedule 28.11.2019


Ответы (1)


Предполагая, что последняя lapply - ваша проблема, рассмотрите вложенный lapply, чтобы присвоить результат abc:

abc <- lapply(out, function(o)
           lapply(o, function(x) pointsOnLines(x, eps=10))
           # EQUIVALENTLY:
           # lapply(o, pointsOnLines, eps=10)
       )

И для построения графика в соответствии с документами запустите поэлементный цикл с Map (оболочка для mapply) между списками out и abc.

Одна пара psp и ppp:

plot(out[[1]], main="")
plot(abc[[1]], add=TRUE, pch="+")

Несколько пар psp и ppp:

proc_plot <- function(X, Y) {
    plot(X, main="")
    plot(Y, add=TRUE, pch="+")
}

result <- Map(proc_plot, out, abc)
person Parfait    schedule 27.11.2019