Как бы я растр список двоичных матриц и найти сгустки 0s? - PullRequest
0 голосов
/ 01 ноября 2019

Я включил свою попытку:

set.seed(12345)
x <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)

set.seed(9999)
y <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)

set.seed(12345)
z <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)

mat_list <- list(x, y, z)

library(igraph)
library(raster)

lapply(list, function (list) {
 Rastermat <- raster(list)
 Clumps <- as.matrix(clump(Rastermat, directions = 8))

 #turning the clumps into a list
 tot <- max(Clumps, na.rm=TRUE)
 res <- vector("list", tot)
 for (i in 1:tot){
   res[i] <- list(which(Clumps == i, arr.ind = TRUE))
 }
})

Но когда я запускаю это, я получаю вывод NULL для каждой матрицы в списке. Может кто-нибудь помочь мне разобраться в чем дело?

Отредактировано:

 lapply(mat_list, function (onemat) {
 Rastermat <- raster(onemat)
 Clumps <- as.matrix(clump(Rastermat, directions = 8))

 #turning the clumps into a list
 tot <- max(Clumps, na.rm=TRUE)
 res <- vector("list", tot)
 for (i in 1:tot){
   res[i] <- list(which(Clumps == i, arr.ind = TRUE))
 }
 res
})

1 Ответ

0 голосов
/ 01 ноября 2019

Я думаю, вы изо всех сил пытаетесь понять, как работает lapply.

Это (из ваших правок):

lapply(mat_list, function (list) {
  Rastermat <- raster(mat_list)

применяет функцию к каждому элементу mat_list по очереди,Например, вызов foo(mat_list[[1]]), затем foo(mat_list[[2]]) и т. Д. (Где foo аналогичен функции, которую вы написали в lapply).

Внутри функции элемент списка является аргументом функции, который вы назвали list по некоторым причинам. Это плохое имя для вещи в R, потому что ее имя функции и то, что функция получает, является элементом списка, а не самого списка.

Итак, вы делаете: Rastermat <- raster(mat_list) -который применяет raster к всему списку растров , а не к единственному элементу, переданному в функцию как list.

Вместо этого вам нужно Rastermat <- raster(list). Или, что еще лучше, определите свою функцию как function(onemat){, а затем Rastermat <- raster(onemat), чтобы лучше описать, что происходит.

...