Уникальный заголовок для sapply при использовании растров - PullRequest
0 голосов
/ 04 октября 2018

Я использую модель случайного леса, прогнозирую новый набор данных, а затем разбиваю прогноз на 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 голосов
/ 10 октября 2018

Проблема в том, что в исходном коде примера вы вставляете весь список заголовков в 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], чтобы выполнить цикл внутри saply вместе с другими параллельными списками.То же самое, если wrld_simpl является списком, замените его в функции на wrld_simpl[i].

...