Как использовать функции применения нескольких стеков растров - PullRequest
1 голос
/ 21 марта 2020

Уважаемые программисты R, я пытаюсь преобразовать al oop в формулировку типа применения при использовании определенной функции, называемой диссверером. Это функция уменьшения масштаба, которая работает с растровыми данными. он принимает грубый ввод rasterLayer и стек ковариат и создает объект модели, который включает версию входного rasterLayer с точным разрешением, например:

library(dissever)
library(raster)

mod.fine = dissever(
    coarse = edgeroi$carbon,   # coarse resolution raster  
    fine = edgeroi$predictors, # stack of fine resolution covariates
    method = "lm", # regression method used
    p = 0.05, # proportion of pixels sampled for training regression model

  )

Я хочу использовать стек грубых входов слои, а не один растровый слой. Я могу сделать это, используя al oop, чтобы соответствовать модели, которая использует один и тот же стек предикторов с точным разрешением для каждого слоя грубого стека, и я могу сохранить результаты в списке. Например:

#create the stack of coarse layers

Stack.coarse = stack(edgeroi$carbon,edgeroi$carbon*2)


test = list()

   for(i in 1:nlayers(Stack.coarse)) {
     tmp=dissever(coarse=Stack.coarse[[i]],fine=edgeroi$predictors,method="lm",p=0.05)
       test[[i]]=tmp
  }

Но я бы хотел избежать циклов и вместо этого хотел бы использовать функции применения. Стеки являются особым типом списка и при необходимости могут быть преобразованы в список с помощью as.list (stack.name)

Однако я не могу найти правильный синтаксис, который позволяет мне вместо этого использовать lapply или mapply of al oop потому что эти функции, кажется, ожидают только один список, в то время как на входе есть 2 отдельных стека (списки).

Может кто-нибудь помочь, Сара,

1 Ответ

1 голос
/ 23 марта 2020

Вы можете использовать mapply для запуска функции, которая получает соответствующие элементы списков одинаковой длины. Например:

> one = list(1,2,3,4,5)
> two = list(4,3,4,3,4)

Тогда:

> mapply(function(aone, atwo){aone+atwo}, one,two)
[1] 5 5 7 7 9

Если вывод вашей функции более сложный, вы получите их список обратно:

> mapply(function(aone, atwo){list(aone+atwo)}, one,two)
[[1]]
[1] 5

[[2]]
[1] 5

[[3]]
[1] 7

[[4]]
[1] 7

[[5]]
[1] 9

Если ваши списки не равны по длине, то R применит свои обычные правила утилизации и будет жаловаться, если один список не помещается целое число раз в другой.

...