Неверное количество измерений - параллельное вычисление R

У меня проблема с использованием пакета tm и параллельных вычислений в R, и я не уверен, делаю ли я что-то глупое или это ошибка.

Я создал небольшой воспроизводимый пример:

# Load the libraries
library(tm)
library(snow)

# Create a Document Term Matrix
test_sentence = c("this is a test", "this is another test")
test_corpus = VCorpus(VectorSource(test_sentence))
test_TM = DocumentTermMatrix(test_corpus)

# Define a simple function that returns the matrix for the i-th document
test_function = function(i, TM){ TM[i, ] }

Если я запущу простой пример, используя этот пример, я без проблем получу то, что ожидалось:

# This returns the expected list containing the rows of the Matrix
res1 = lapply(1:2, test_function, test_TM)

Но если я запускаю его параллельно, я получаю сообщение об ошибке:

первая ошибка: неправильное количество измерений

# This should return the same thing of the lapply above but instead it stops with an error
cl = makeCluster(2)
res2 = parLapply(cl, 1:2, test_function, test_TM)
stopCluster(cl)

person Lorenzo Rossi    schedule 19.11.2015    source источник


Ответы (1)


Проблема в том, что разные узлы не загружают пакет tm автоматически. Однако загрузка пакета необходима, поскольку он определяет метод [ для соответствующего класса объектов.

Код ниже делает следующее:

  1. запустить кластер
  2. загрузить пакет tm во все узлы
  3. экспортировать все объекты во все узлы
  4. запустить функцию
  5. остановить кластер

cl <- makeCluster(rep("localhost",2), type="SOCK")
clusterEvalQ(cl, library(tm))
clusterExport(cl, list=ls())
res <- parLapply(cl, as.list(1:2), test_function, test_TM)
stopCluster(cl)
person SimonG    schedule 19.11.2015
comment
вы совершенно правы.. какая глупая ошибка. Я предположил, что после того, как матрица была рассчитана, в библиотеке больше не было необходимости, не думая, что метод [ находится внутри пакета. Большое спасибо! - person Lorenzo Rossi; 20.11.2015