Терра::сплит | Сеанс R прерывается при фатальной ошибке разделения многоугольника

При попытке разделить многоугольник R выдает фатальную ошибку и завершает работу. Это происходит при использовании R Studio и R на себе. Я написал код в более ранней версии R на другом компьютере (тоже Mac), но в настоящее время у меня нет к нему доступа. Это произошло, когда я попытался запустить код на своей нынешней машине. Код является частью функции, которая отлично работала на другом компьютере. Мне не удалось найти решение. Где-то рекомендовалось переустановить пакеты и зависимости и обновить R и R Studio до последней версии, что я и сделал. Но это не помогло. Размер растра, на котором основаны векторные данные, составляет всего около 60 МБ, поэтому не должно возникнуть проблем, поскольку он слишком велик.

library(landscapetools)
library(tidyverse)
library(raster)
library(terra)

raster <- rast("some_raster.tif")
raster <- util_classify(raster, n = 3, level_names = c(1, 2, 3))
polygons <- as.polygons(raster, dissolve = T)
polygon.split <- split(polygons,c(1, 2, 3))

Это приводит к следующему:

    *** caught segfault ***
    address 0x0, cause 'invalid permissions'
    
    Traceback:
     1: .External(list(name = "CppMethod__invoke_notvoid", address = <pointer: 0x6000024030a0>,     dll = list(name = "Rcpp", path = "/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/Rcpp/libs/Rcpp.so",         dynamicLookup = TRUE, handle = <pointer: 0x2043f2000>,         info = <pointer: 0x600000091380>, forceSymbols = FALSE),     numParameters = -1L), <pointer: 0x60000189d900>, <pointer: 0x6000025e5660>,     .pointer, ...)
     2: x@ptr$split(f)
     3: methods::.hasSlot(x, "ptr")
     4: messages(x@ptr$split(f), "split")
     5: .local(x, f, ...)
     6: split(polygons, c(1, 2, 3))
     7: split(polygons, c(1, 2, 3))
    
    Possible actions:
    1: abort (with core dump, if enabled)
    2: normal R exit
    3: exit R without saving workspace
    4: exit R saving workspace

Вот также информация о сеансе:

    > sessionInfo()
    R version 4.4.1 (2024-06-14)
    Platform: aarch64-apple-darwin20
    Running under: macOS Monterey 12.0.1
    
    Matrix products: default
    BLAS:   /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRblas.0.dylib 
    LAPACK: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.0
    
    locale:
    [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
    
    time zone: Europe/Zurich
    tzcode source: internal
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    other attached packages:
     [1] terra_1.7-78         raster_3.6-26        sp_2.1-4            
     [4] lubridate_1.9.3      forcats_1.0.0        stringr_1.5.1       
     [7] dplyr_1.1.4          purrr_1.0.2          readr_2.1.5         
    [10] tidyr_1.3.1          tibble_3.2.1         ggplot2_3.5.1       
    [13] tidyverse_2.0.0      landscapetools_0.5.0
    
    loaded via a namespace (and not attached):
     [1] gtable_0.3.5     compiler_4.4.1   tidyselect_1.2.1 Rcpp_1.0.12     
     [5] scales_1.3.0     lattice_0.22-6   R6_2.5.1         generics_0.1.3  
     [9] munsell_0.5.1    pillar_1.9.0     tzdb_0.4.0       rlang_1.1.4     
    [13] utf8_1.2.4       stringi_1.8.4    timechange_0.3.0 cli_3.6.3       
    [17] withr_3.0.0      magrittr_2.0.3   grid_4.4.1       hms_1.1.3       
    [21] lifecycle_1.0.4  vctrs_0.6.5      glue_1.7.0       codetools_0.2-20
    [25] fansi_1.0.6      colorspace_2.1-0 tools_4.4.1      pkgconfig_2.0.3 
    > 

По предложению Криса я написал новый сценарий, используя только terra. Я стараюсь сделать это воспроизводимым. split по-прежнему вызывает прерывание сеанса.

library(tidyverse)
library(terra)
library(BAMMtools)
raster <- rast(system.file("ex/elev.tif", package = "terra"))
rvals <- values(raster, mat=F, dataframe=F, na.rm=T)
jenks <- getJenksBreaks(rvals, 4)
m <- c(jenks[1], jenks[2],1,
       jenks[2], jenks[3], 2,
       jenks[3], jenks[4], 3)
rclmat <- matrix(m, ncol=3, byrow=TRUE)
rc1 <- classify(raster, rclmat, include.lowest=TRUE)
jenks.poly <- as.polygons(rc1, dissolve = T)
polygon.split <- split(jenks.poly,c(1, 2, 3))

здесь сообщение об ошибке:

 *** caught segfault ***
address 0x0, cause 'invalid permissions'

Traceback:
 1: .External(list(name = "CppMethod__invoke_notvoid", address = <pointer: 0x600001f056c0>,     dll = list(name = "Rcpp", path = "/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/Rcpp/libs/Rcpp.so",         dynamicLookup = TRUE, handle = <pointer: 0x204d9a520>,         info = <pointer: 0x600003b943c0>, forceSymbols = FALSE),     numParameters = -1L), <pointer: 0x6000023ab600>, <pointer: 0x600001efb000>,     .pointer, ...)
 2: x@ptr$split(f)
 3: methods::.hasSlot(x, "ptr")
 4: messages(x@ptr$split(f), "split")
 5: .local(x, f, ...)
 6: split(jenks.poly, c(1, 2, 3))
 7: split(jenks.poly, c(1, 2, 3))

Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace

Разработка Landscapetools фактически прекратилась два года назад. Имея в виду ожидаемые результаты от вашей предыдущей работы с теперь сломанным сценарием, вы, вероятно, могли бы достичь тех же результатов полностью в пределах terra, используя либо terra::classify, либо terra::subst. Сначала мы согласовали некоторые данные, например, ваши 60 МБ или <- system.file("ex/elev.tif", package = "terra") и «как это должно выглядеть». Еще раз добро пожаловать в Stackoverflow.

Chris 18.07.2024 18:31

Без landscapetools и raster я смог выделить ошибку split и теперь пытаюсь выяснить, как я туда попал в виде репрекса. Но я считаю split скользким.

Chris 18.07.2024 23:15

Я полагался на Landscapetools::util_classify, потому что он рассчитывает естественные разрывы с использованием оптимизации Дженкса, чего я и добивался. с terra::classify мне нужно будет выполнить этот расчет с помощью отдельной команды. Но я попробую. Что вы имеете в виду под словом скользкий? как я могу дать вам свой растр?

Amantil 19.07.2024 10:01

Спасибо за предложения, Крис. Я скорректировал код, но разделение по-прежнему дает сбой.

Amantil 19.07.2024 12:36

Еще один подход к «дженсу» через обсуждение classInt. В sp и raster, но применимо. Ошибки сегмента split возникают тогда, когда в качестве второго объекта представлена ​​«ерунда», а здесь c(1,2,3) нет внутреннего теста, который мог бы защититься от такой чепухи. Другие тесты валидности 2-го объекта length(f) == nlyr(r) являются примерами внутренней защиты.

Chris 19.07.2024 18:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это явно ошибка (R никогда не должен давать сбой), и о ней лучше всего сообщать там, где разрабатывается программное обеспечение (например, на github).

Фактически, об этой проблеме сообщалось ранее и она была исправлена ​​в разрабатываемой версии. На сайте github есть инструкции по установке версии для разработчиков:

install.packages('terra', repos='https://rspatial.r-universe.dev') 

В этой версии у меня работает пример:

library(terra)
#terra 1.7.80

r <- rast(system.file("ex/elev.tif", package = "terra"))
rclmat <- matrix(c(141, 306, 403, 306, 403, 547, 1, 2, 3), ncol=3)
rc1 <- classify(r, rclmat, include.lowest=TRUE)
p <- as.polygons(rc1, dissolve = T)

# I would do this
s1 <- split(p, "elevation")
# but you can do
s2 <- split(p, 1:3)

str(s1)
#List of 3
# $ 1:S4 class 'SpatVector' [package "terra"]
# $ 2:S4 class 'SpatVector' [package "terra"]
# $ 3:S4 class 'SpatVector' [package "terra"]

Я был в версии 1.7.78, прочитал basic_string::_M_create, но забыл установить лимит отчетов о сбоях, поэтому отчета для сравнения с № 1530 не было. Я никогда не возьму крах в любой день. Для удобства ОП вы можете упомянуть, как были получены значения матрицы from, to, becomes для «от», «до» и «мои».

Chris 20.07.2024 03:32

Спасибо вам обоим за полезные комментарии. Я проверил GitHub и установил версию для разработки, как написано выше. Мой код теперь работает. В следующий раз я научусь заглядывать на страницу разработки на Github. Однако я не понимаю, как решить проблему Basic_string::_M_create.

Amantil 22.07.2024 08:49

Другие вопросы по теме