在下面的示例中,我们创建了一个单元格值为1和2的景观。然后,我们想创建ID为3的补丁,大小在1到10个细胞之间,并重复此操作,直到有50个细胞具有补丁ID。
如何存储循环每次迭代的随机补丁大小,以便我最终得到一个所选补丁大小的列表。
library(landscapeR)
library(raster)
Test_landscape <- raster(nrows=50, ncols=50, vals=1) # create raster
Test_landscape[Test_landscape[] == 1] <- # will have 20% unsuitable for patch
sample(
c(1,2),
size = length(Test_landscape[Test_landscape[] ==
1]),
replace = T,
prob = c(0.7, 0.2)
)
while (length(Test_landscape[Test_landscape[] == 3]) < 50) { # repeat patch making until we have 50 cells
size.clusters <- as.numeric(sample(1:10, 1)) # These are the values that I would like to store?
Test_landscape <-
makePatch(
Test_landscape,
size = size.clusters,
bgr = 1, # sutiable cells to make a patch
edge = FALSE,
rast = TRUE,
val = 3 # values given to new patch
)
}
让我们从set.seed开始,并建议您的初始sample
没有达到所需的效果,这样您就可以看看是否绘制了它。当我尝试组合它们时,事情不起作用时,我会将它们分解成更小的工作部件:
library(landscapeR)
library(raster)
set.seed(516)
tst_ls <- raster(nrows = 50, ncols = 50,vals = 1)
ncell(tst_ls)
[1] 2500
tst_12 <- sample(c(1,2), size = ncell(tst_ls), replace = TRUE, prob=c(0.7, 0.2))
tst_ls <- setValues(tst_ls, tst_12)
ncell(tst_ls) * 0.7
[1] 1750
length(which(values(tst_ls) == 1))
[1] 1976
length(which(values(tst_ls) == 2))
[1] 524
足够近吗?,因为样本prob是CCD_ 2。建议使用makeClass
,而不是makePatch
,所以我们将在您的时间范围内尝试使用。我们可能需要一些空的val,在while
循环之外初始化,然后对符号进行一些更改:
patches <- vector(mode = "numeric", length = 18L)
for (i in 1:18) {
patches[i] <- sample(1:10, 1)
}
> patches
[1] 1 3 6 8 1 7 6 8 6 10 6 10 4 1 7 8 4 8
> sum(patches)
[1] 104 # so we'll get to 50
while ((freq(tst_ls, value = 3) < 50)) {
tst_ls <- makeClass(
context = tst_ls,
npatch = max(which(cumsum(patches) < 50)), # matches while
size = patches[1:npatch],
bgr = 1,
edge = FALSE,
rast = TRUE,
val = 3
)
}
在< 50
的上下文中留下这一点是为了让人挠头。#检查补丁
> patches
[1] 1 3 6 8 1 7 6 8 6 10 6 10 4 1 7 8 4 8
> cumsum(patches)
[1] 1 4 10 18 19 26 32 40 46 56 62 72 76 77 84 92 96 104
对npatch
和size
的调整使其与while
保持一致,并最终按照我认为您想要的方式工作。包装很酷。