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