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