使用循环运行多个功能并分别保存输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用循环运行多个功能并分别保存输出相关的知识,希望对你有一定的参考价值。

很抱歉的描述表示歉意。我确定这是一个非常简单的问题,但是对于循环来说我是一个新手,还无法弄清楚。我也不知道如何提供可复制的空间数据,所以...

我有由来自标记动物的一系列点组成的空间数据。我正在使用包adehabitat创建包含点可变百分比的最小凸多边形。然后,我将每个多边形另存为.shp文件,并以唯一的动物ID,日期范围和百分比命名,然后根据其来自哪个网站将其保存到其他目录中。这是我经常执行的一项操作,因此我想尽可能地使其自动化。

这是我现在正在使用的:

library(sp)
library(adehabitatHR)
library(rgdal)

df <- read.csv('data.csv', stringsAsFactors=FALSE)

site <- 'SiteName'
date <- '2019-06-22_2019-07-20'
id <- 'HAR04'

# The adehabitat packages requires data to be in a spatial format.
coordinates(df) <- df[, c('lon', 'lat')]
proj4string(df) = CRS("+init=epsg:4326")

# Create the polygons for each percentage point.
# The column specified just refers to the id, which adehabitat requires
mcp_est100 <- mcp(df[, 2], percent = 100)
mcp_est90 <- mcp(df[, 2], percent = 90)
mcp_est50 <- mcp(df[, 2], percent = 50)

# Save the polygons as shapefiles.
writeOGR(obj=mcp_est100,
         dsn=site,
         layer=paste(id, '_', date, '_100', sep=''), 
         driver='ESRI Shapefile', overwrite_layer=TRUE)

writeOGR(obj=mcp_est90,
         dsn=site,
         layer=paste(id, '_', date, '_90', sep=''), 
         driver='ESRI Shapefile', overwrite_layer=TRUE)

writeOGR(obj=mcp_est50,
         dsn=site,
         layer=paste(id, '_', date, '_50', sep=''), 
         driver='ESRI Shapefile', overwrite_layer=TRUE)

您可以看到代码是高度重复的,如果发生任何变化(例如,如果我要80%的多边形而不是50%的多边形),我需要在多个位置进行更改。我是否可以使用for循环或某种apply函数来简化此过程?预先感谢。

答案

在您的情况下,我会使用purrr::walk

library(sp)
library(adehabitatHR)
library(rgdal)

df <- read.csv('data.csv', stringsAsFactors=FALSE)

site <- 'SiteName'
date <- '2019-06-22_2019-07-20'
id <- 'HAR04'

# The adehabitat packages requires data to be in a spatial format.
coordinates(df) <- df[, c('lon', 'lat')]
proj4string(df) = CRS("+init=epsg:4326")

purrr::walk(c(100, 90, 50), function(x){
  writeOGR(obj=mcp(df[, 2], percent = x),
           dsn=site,
           layer=paste(id, '_', date, '_', as.character(x), sep=''), 
           driver='ESRI Shapefile', overwrite_layer=TRUE)
})

以上是关于使用循环运行多个功能并分别保存输出的主要内容,如果未能解决你的问题,请参考以下文章

保存 foreach dopar 循环的多个输出

在循环中运行相同的函数并保存输出

将多个输出中的hls属性设置为单独的片段代码

使用While循环导出Excel

R中的并行计算,用于通过循环保存数据

如何在Sublime Text中添加代码片段