如何在R中的while循环中存储随机生成的值



在下面的示例中,我们创建了一个单元格值为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

npatchsize的调整使其与while保持一致,并最终按照我认为您想要的方式工作。包装很酷。

最新更新