При попытке разделить многоугольник 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
и raster
я смог выделить ошибку split
и теперь пытаюсь выяснить, как я туда попал в виде репрекса. Но я считаю split
скользким.
Я полагался на Landscapetools::util_classify, потому что он рассчитывает естественные разрывы с использованием оптимизации Дженкса, чего я и добивался. с terra::classify мне нужно будет выполнить этот расчет с помощью отдельной команды. Но я попробую. Что вы имеете в виду под словом скользкий? как я могу дать вам свой растр?
Спасибо за предложения, Крис. Я скорректировал код, но разделение по-прежнему дает сбой.
Еще один подход к «дженсу» через обсуждение classInt. В sp
и raster
, но применимо. Ошибки сегмента split
возникают тогда, когда в качестве второго объекта представлена «ерунда», а здесь c(1,2,3)
нет внутреннего теста, который мог бы защититься от такой чепухи. Другие тесты валидности 2-го объекта length(f) == nlyr(r)
являются примерами внутренней защиты.
Это явно ошибка (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
для «от», «до» и «мои».
Спасибо вам обоим за полезные комментарии. Я проверил GitHub и установил версию для разработки, как написано выше. Мой код теперь работает. В следующий раз я научусь заглядывать на страницу разработки на Github. Однако я не понимаю, как решить проблему Basic_string::_M_create.
Разработка Landscapetools фактически прекратилась два года назад. Имея в виду ожидаемые результаты от вашей предыдущей работы с теперь сломанным сценарием, вы, вероятно, могли бы достичь тех же результатов полностью в пределах
terra
, используя либоterra::classify
, либоterra::subst
. Сначала мы согласовали некоторые данные, например, ваши 60 МБ или<- system.file("ex/elev.tif", package = "terra")
и «как это должно выглядеть». Еще раз добро пожаловать в Stackoverflow.