如何在R中循环整个脚本

hpcdzsge  于 2023-06-03  发布在  其他
关注(0)|答案(1)|浏览(142)

我有一个很长的脚本,有很多数据操作,这将是太长了,完全分享,但我会分享一些部分,以澄清我是什么。脚本中有一个生成随机点的函数,因此我创建的最终对象总是不同的。我想做的是循环整个脚本100次,并将许多结果对象存储在一个列表中。
这里是一些脚本

area <- read_sf("area_erase.shp")

#List of rasters
agrilist <- sprintf('p%s_agriprop.tif', 1:6) 
results_agri <- lapply(agrilist, raster) 
results_agri <- setNames(results_agri, agrilist)

#List of second rasters
poplist <- sprintf('p%s_pop.tif', 1:6) 
results_pop <- lapply(poplist, raster) 
results_pop <- setNames(results_pop, poplist)

#resample one of the rasters
results_agri[[6]] <- resample(results_agri[[6]],results_agri[[5]],method="bilinear")

#stack them
allrasters <- mapply(raster::stack,results_agri,results_pop)

#load in existing points
pointslist <- sprintf('p%s_utm_n.csv', 1:6) 
results_points <- lapply(pointslist, read.csv) 
results_points <- setNames(results_points, pointslist)

#prepare for extract (lon lat cols only)
extr <- function(xts.obj){xts.obj[,c(2:3)]}

points_xy <- lapply(results_points, extr)

等等等等
“random”部分确保脚本每次运行时都有不同的结果,如下所示

#create random points
pas[[1]] <- randomPoints(results_agri[[1]],n=1082,p=points_xy[[1]],ext=area)
pas[[2]] <- randomPoints(results_agri[[1]],n=2506,p=points_xy[[2]],ext=area)
pas[[3]] <- randomPoints(results_agri[[1]],n=2326,p=points_xy[[3]],ext=area)
pas[[4]] <- randomPoints(results_agri[[1]],n=3168,p=points_xy[[4]],ext=area)
pas[[5]] <- randomPoints(results_agri[[1]],n=3216,p=points_xy[[5]],ext=area)
pas[[6]] <- randomPoints(results_agri[[1]],n=3176,p=points_xy[[6]],ext=area)

剧本的最后一部分,

#Final values
st1 <- cellStats(prediction1>tr1,sum)
st2 <- cellStats(prediction2>tr2,sum)
st3 <- cellStats(prediction3>tr3,sum)
st4 <- cellStats(prediction4>tr4,sum)
st5 <- cellStats(prediction5>tr5,sum)
st6 <- cellStats(prediction6>tr6,sum)

这6个对象是一个单一的数值每个,并将不同的每一次迭代脚本,所以我想运行这些100次,一次在每一次迭代结束,然后存储在一个列表中的输出
我该怎么办?我在考虑一个'repeat'循环,但不确定如何将最终对象存储在列表中,并在完成100次迭代后中断循环。

6l7fqoea

6l7fqoea1#

如果我对这个问题的理解是正确的,你可以使用从1到100的for()循环,每次将得到的六个值保存为列表中的一个元素(可以是列表或向量):

output <- vector(mode="list", length=100)
for(i in 1:100){
  ## functions to creat intermediate objects
  st1 <- cellStats(prediction1>tr1,sum)
  st2 <- cellStats(prediction2>tr2,sum)
  st3 <- cellStats(prediction3>tr3,sum)
  st4 <- cellStats(prediction4>tr4,sum)
  st5 <- cellStats(prediction5>tr5,sum)
  st6 <- cellStats(prediction6>tr6,sum)
  output[[i]] <- list(st1=st1, st2=st2, 
                      st3=st3, st4=st4, 
                      st5=st5, st6=st6)
}

或者,如果你想让output的每个元素都是一个向量而不是一个列表,你可以用下面的代码替换上面的相关行:

output[[i]] <- c(st1=st1, st2=st2, 
                    st3=st3, st4=st4, 
                    st5=st5, st6=st6)

相关问题