R передать аргумент при поиске другого файла под foreach [duplicate]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

15
задан svick 23 February 2015 в 04:17
поделиться

3 ответа

Я не могу полностью воспроизвести игрушку, но у меня была аналогичная проблема, которую я смог решить:

source(file, local = TRUE)

, которая должна анализировать источник в локальной среде, то есть распознавать i.

10
ответ дан Sosel 19 August 2018 в 05:33
поделиться

Я, наконец, решил проблему, преобразовывая источник («дополнение.R») в функцию и просто передавая в нее переменные. Я не знаю, почему, но предлагаемые решения, основанные на source(file, local = TRUE), не работают.

4
ответ дан CoderInNetwork 19 August 2018 в 05:33
поделиться
  • 1
    То, что source("addition.R", local = TRUE) не сработает, не имеет для меня смысла. Можете ли вы воспроизвести ошибку с воспроизводимым примером, который я принял из вашего ОП? Или вы ссылаетесь на более сложный R-скрипт? Если последнее, могут быть миллионы причин. Кроме того, какая настройка / sessionInfo()? – HenrikB 27 October 2017 в 20:21
  • 2
    Я говорю о точном упомянутом сценарии и точной ошибке. – CoderInNetwork 27 October 2017 в 21:10
  • 3
    Это действительно странно. Вы также получаете ошибку в этом примере local({ for(i in 1:12) ... })? Если это так, это исключает foreach и т. Д. Важно, что ваш sessionInfo() после получения ошибки? Я подозреваю, что что-то в вашей настройке вызывает эту разницу. Запуск R в терминале или в графическом интерфейсе (например, RStudio)? – HenrikB 27 October 2017 в 22:38

Комментарий от NiceE и ответ Sosel уже обращаются к этому; при вызове source(file) он по умолчанию имеет значение source(file, local = FALSE), что означает, что код в файле, полученном из источника, оценивается в глобальной среде («рабочая область пользователя»), и есть, cf. ?source. Обратите внимание, что в глобальной среде нет переменной i. Решение состоит в том, чтобы убедиться, что файл получен в среде, вызывающей его, то есть использовать source(file, local = TRUE).

Решение:

library("foreach")

y <- foreach(i = 1:2) %dopar% {
  i + 2
}
str(y)

doMC::registerDoMC(cores = 2L)
y <- foreach(i = 1:2) %dopar% {
  source("addition.R", local = TRUE)
}
str(y)

Пример той же проблемы с for():

Тот факт, что source() оценивается в глобальной среде, которая отличается от вызывающей среды, в которой живет i, также может быть проиллюстрирована с использованием регулярного цикла for, запустив цикл for в другая среда, чем глобальная, например внутри функции или посредством:

local({
  for(i in 1:2) {
    source("addition.R")
  }
})

, которая дает:

Error in eval(ei, envir) : object 'i' not found

. Теперь причина, по которой выше foreach(i = 1:2) %dopar% { source("addition.R") } работает с registerDoSEQ() , если и только если вызывается из глобальной среды, заключается в том, что тогда итерация foreach вычисляется в вызывающей среде, которая является глобальной средой, которая является средой, используемой source(). Однако, если вы использовали local(foreach(i = 1:2) %dopar% { ... }), это также не соответствует аналогичному вышесказанному local(for(i in 1:2) { ... }) вызову.

В заключение: ничего волшебства не происходит, но понять это немного утомительно.

4
ответ дан HenrikB 19 August 2018 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: