使用栅格时sapply的唯一标题

时间:2018-10-03 21:30:14

标签: r plot raster

我正在运行一个随机森林模型,在一个新的数据集上进行预测,然后将预测分为20年,将其转换为栅格并在每个时间段进行映射。下面的代码非常有用,除了我无法使每个图的标题都唯一。我尝试创建列表并调用名称或姓氏,但到目前为止没有任何效果。照原样打印上面所有3个标题的每个地图。

enter image description here

如果我尝试使用Rasts [l]之类的东西,则会得到-Rasts [l]错误:下标类型为'S4'

我的猜测是,因为这是一个栅格,所以它的行为不像典型的数据框,因为我发现的所有潜在解决方案都没有用。

#subsets by year
sp1960 <- predict_all[predict_all$year>1960  &predict_all$year<1980,]
sp1980 <- predict_all[predict_all$year>=1980 &predict_all$year<2000,]
sp2000 <- predict_all[predict_all$year>=2000 &predict_all$year<2020,]

#turn the data into a raster
library(plotKML)
library(RColorBrewer)

Rasts <- list("A"=sp1960,"B"=sp1980,"C"=sp2000)
title_list <- list("A", "B", "C")

par(mfrow = c(2, 2))
sapply(Rasts, function(l) {
new_rasts<-raster(vect2rast(l, fname = names(l)[2], cell.size=.05))
pal <- brewer.pal(n = 9, name = "PuBu")
scale_range <- c(0, 1)
title <-paste("RF:",title_list,sp_name)
plot(new_rasts, col=pal,zlim=scale_range, main=title)
plot(wrld_simpl, add=TRUE, border='dark grey')
})

1 个答案:

答案 0 :(得分:1)

问题似乎是,在您的原始示例代码中,您将title_list中的整个标题列表粘贴到了每个图形的title中。

如果没有包含最小的可复制示例,则无法进行测试。

但是,您可以尝试修改sapply语句,使其遍历Rasts列表的索引。通过为sapply循环使用索引,您可以引用例如Rasts[i]title_list[i]按索引编号排列,然后随即进行匹配。

例如,我认为您需要将sapply调用修改为:

sapply(seq_along(Rasts), function(i) {
  new_rasts<-raster(vect2rast(Rasts[i], fname = names(Rasts[i])[2], cell.size=.05))
  pal <- brewer.pal(n = 9, name = "PuBu")
  scale_range <- c(0, 1)
  title <-paste("RF:",title_list[i],sp_name)
  plot(new_rasts, col=pal,zlim=scale_range, main=title)
  plot(wrld_simpl, add=TRUE, border='dark grey')
})

上面,(由于您尚未在OP中的任何位置定义它)我从示例输出中猜测sp_name是一个字符常量(即,由于缺乏其他信息,它在您所有的图形标题输出)。

如果sp_name是一个列表,只需将其替换为sp_name[i]就可以在函数中与其他并行列表一起循环。如果wrld_simpl是列表,则相同,将其替​​换为wrld_simpl[i]