Как назначить изменения строки в существующей матрице в функции 'apply' из параллельного пакета - PullRequest
1 голос
/ 05 февраля 2020

В R можно использовать символ <<- в функции lapply(), чтобы присвоить значение переменной вне lapply().

Давайте рассмотрим матрицу, полную 1:

m<-matrix(data=1, nrow=5, ncol=5)

Допустим, я хочу заменить каждую строку на значения 1,2,3,4 и 5, используя символ присваивания <<-. Я могу использовать функцию lapply (она не предназначена для такого рода операций, это только пример):

lapply(X = seq(nrow(m)), FUN = function(r){
  m[r,]<<-seq(5)
})

Это будет работать.

Но если я Теперь используйте mclapply следующим образом:

mclapply(X = seq(nrow(m)), FUN = function(r){
  m[r,]<<-seq(5)
})

Матрица m останется заполненной 1.

Идея состоит в том, чтобы применить изменения к строкам матрицы, не создавая новую, а скорее присваивая их в существующем. Единственное ограничение - использовать функцию из параллельного пакета (например, mclapply (), но, возможно, лучше подойдет другая функция).
Также использование символа <<- не обязательно.
Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Вы не можете назначить параллельно, так как вы просто назначаете локальную копию матрицы.

Два решения:

  1. Использовать общую память ( например, матрицы на диске с использованием пакета {bigstatsr}; заявление об отказе: я автор)

  2. Не назначайте в первую очередь. Просто запустите lapply(), получите все части результатов в виде списка и используйте do.call("rbind", list).

1 голос
/ 05 февраля 2020

Как насчет этого, используя будущий пакет

library(future)
plan(multiprocess) 

m <- matrix(data = 1, nrow = 5, ncol = 5)

# we create a set of futures, so the values are calculated in parallele and
# not sent back to the main environment
fs <- lapply(seq(nrow(m)), function(x) future(seq(5) + x))

# when then pull the values one by one and apply them where they belong
for (i in seq(nrow(m))) {
  m[i, ] <- value(fs[[i]])
}

# or the same way you did it:
lapply(X = seq(nrow(m)), FUN = function(r){
  m[r,] <<- value(fs[[r]]) 
})

Недостатком здесь является то, что значения присваиваются последовательно, но, по крайней мере, они рассчитываются параллельно. Но я не думаю, что вы собираетесь использовать матрицу до того, как все вычисления будут выполнены.

...