我想编写一个函数来打开多个shapefile(其中有46个),每个都存储在自己的文件夹中。我正在使用非营利组织的数据,这就是他们存储它的方式,因此我编写代码以符合他们的数据存储实践(我知道它并不理想)。
我试着写这个功能,它有时会起作用,有时候也不行。我在打开文件时遇到了问题(奇怪的是,有些shapefile可以正常工作,而对于其他人我会收到错误)。另外,我不知道如何将文件分配给对象。
我首先获取wd中的shapefile文件夹列表:
shapefiles <- list.dirs(path = "./StateShapefiles", full.names = FALSE,
recursive = FALSE)
然后我编写我的函数(文件和文件夹具有相同的名称):
readshapefile <- function(x){
statename <- deparse(substitute(x))
filefolder <- paste(wd,statename, sep="/")
assign(x,readOGR(dsn=filefolder,layer=statename))
}
我尝试调用该函数并收到此错误:
readshapefile(alabama)
Error in assign(x, readOGR(dsn = filefolder, layer = statename)) :
object 'alabama' not found
然后我想做类似的事情:
for (x in shapefiles){
readshapefile(x)
}
我无法判断这是否有效,因为我无法弄清楚之前的部分。
我怀疑问题是readOGR不会将对象作为参数;它只想要字符串,但我不知道。如果任何人都可以帮助解决一个没有告诉组织移动文件的解决方案(不幸的是,这不会发生),那就太好了!我总是可以写46行readOGR,但这并不理想。
答案 0 :(得分:0)
没有样本数据,很难给你很好的答案。这可能更接近您的需求。
shapefiles <- list.dirs(path = "./StateShapefiles", full.names = FALSE,
recursive = FALSE)
#function reads and returns object for given state
readshapefile <- function(statename){
filefolder <- paste(getwd(), statename, sep="/")
# display a message to help with debugging
cat("Reading ", statename, " from ", filefolder, "\n")
return(readOGR(dsn=filefolder, layer=statename))
}
#test the function, assigning to an object name
alabama_object <- readshapefile("alabama")
# lapply will call the function once for each state name
# passing the state name as a parameter
all_shapes <- lapply(shapefiles, readshapefile)