我试图通过使用函数和for
循环来缩短代码。
对于下面的例子,我想创建5个不同的对象,然后将raster
应用到每个创建的对象上。我如何使用循环和函数来实现这一点呢?
#Defining variables of interest
url = "https://files.isric.org/soilgrids/latest/data/" # Path to the webDAV data.
voi1 = "sand"
voi2 = "clay"
voi3 = "silt"
voi4 = "phh2o"
voi5 = "soc"
depth = "5-15cm"
quantile = "mean" # prediction uncertainty quantified by probability distribution. Using mean of distribution
voi_layer1 = paste(paste(paste(url, voi1, "/", voi1, sep=""), depth, quantile, sep="_"), '.vrt', sep="")
voi_layer2 = paste(paste(paste(url, voi2, "/", voi2, sep=""), depth, quantile, sep="_"), '.vrt', sep="")
voi_layer3 = paste(paste(paste(url, voi3, "/", voi3, sep=""), depth, quantile, sep="_"), '.vrt', sep="")
voi_layer4 = paste(paste(paste(url, voi4, "/", voi4, sep=""), depth, quantile, sep="_"), '.vrt', sep="")
voi_layer5 = paste(paste(paste(url, voi5, "/", voi5, sep=""), depth, quantile, sep="_"), '.vrt', sep="")
#Apply 'raster' so can derive descriptions of each layer
sand = raster(voi_layer1)
clay = raster(voi_layer2)
silt = raster(voi_layer3)
ph = raster(voi_layer4)
org_carb = raster(voi_layer5)
3条答案
按热度按时间hxzsmxv21#
有几种方法可以简化代码。由于对每个VOI执行相同的操作,因此可以将它们存储在一个向量中。注意,这里的
voi
包含所有5个VOI:我们可以使用
sprintf
来更简洁地创建fetch URL:最后,我们可以使用
lapply
对每个构造的URL执行raster()
函数(lapply
是一个循环函数)。请注意,由于我们已经为上述
urls
的元素提供了名称,因此这些名称将保留在rasters
结果中,因此您可以使用数字索引(rasters[1]
)或命名索引(rasters['sand']
)来检索各个栅格。7hiiyaii2#
另一个变化
“raster”已过时,我们改用“terra”并创建SpatRasterDataset
或SpatRasters列表
另请参阅
geodata::soil_world
和geodata::soil_world_vsi
以获取这些数据。nqwrtyyt3#
一般来说,你可以创建一个函数来创建一个对象,在一个for循环中调用它,然后使用
assign
来为它们赋值变量名。我推荐使用“glue”包中的glue
函数,因为它比paste
更直观。我不能让raster
函数在我的电脑上工作,因为我得到了this error。然而,这就是我的想法。