r: присвоение значений растрам с перекрытием - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь присвоить значения нескольким растровым файлам в папке и применить к ним функцию raster() с конечной целью построить для них график, сложить и подчинить алгебру. Таким образом, каждому растровому файлу в папке будет присвоено значение «r1», «r2» и c. Пока у меня есть:

f <- list.files(path="path/to/files", pattern="*.tif", full.names=TRUE, recursive=FALSE)

head(f)

[1] "path/to/files/wc2.1_2.5m_prec_1970-01.tif"    
[2] "path/to/files/wc2.1_2.5m_prec_1970-01.tif.ovr"
[3] "path/to/files/wc2.1_2.5m_prec_1970-02.tif"    
[4] "path/to/files/wc2.1_2.5m_prec_1970-02.tif.ovr"
[5] "path/to/files/wc2.1_2.5m_prec_1970-03.tif"    
[6] "path/to/files/wc2.1_2.5m_prec_1970-03.tif.ovr"

r <- lapply(f, raster)
lapply(r, function(i){
  assign(paste0("r", i), i)
})

Однако, если я верну r1, он даст только следующий результат:

> r1
[1] 1

Я не уверен, как гарантировать, что r возвращает фактический растр, а не просто целое число.

1 Ответ

0 голосов
/ 09 мая 2020

Что вы должны сделать, это

f <- list.files(path="path/to/files", pattern="\\.tif$", full.names=TRUE)
library(raster)
s <- stack(f)

Теперь к вашему вопросу: что бы вы ни делали, не используйте assign. Считать, что вам это нужно, - распространенная ошибка новичков. У него очень мало хороших применений - и, скорее всего, он вам никогда не понадобится. Его использование приводит к ужасному коду со многими объектами, которые вы вызываете по имени.

Что вы должны делать, зависит от того, что будет дальше, и вы не сказали нам (но, вероятно, это то, что я показываю выше). Как правило, если вы хотите использовать имена, вы можете давать имена элементам списка

names(r) <- paste0("r", 1:length(r))

Но это может быть более полезно

names(r) <- gsub(".tif", "", basename(f))

Если слои имеют одинаковый размер и разрешение, создайте RasterStack и назовите слои (но вы действительно должны использовать stack в именах файлов, как я показал выше)

s <- stack(r)
names(s) <- paste0("r", 1:nlayers(s))

Кроме того, в list.files вы должны использовать pattern="\\.tif$" чтобы не включать файлы "* .ovr". Важной частью здесь является $, в котором говорится, что имя должно заканчиваться на .tif. \\ означает, что вы действительно хотите . и не используете его как подстановочный знак (т.е. любой символ), что вы и делаете.

f <- list.files(path="path/to/files", pattern="\\.tif$", full.names=TRUE)
...