Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Я не могу полностью воспроизвести игрушку, но у меня была аналогичная проблема, которую я смог решить:
source(file, local = TRUE)
, которая должна анализировать источник в локальной среде, то есть распознавать i.
Я, наконец, решил проблему, преобразовывая источник («дополнение.R») в функцию и просто передавая в нее переменные. Я не знаю, почему, но предлагаемые решения, основанные на source(file, local = TRUE)
, не работают.
source("addition.R", local = TRUE)
не сработает, не имеет для меня смысла. Можете ли вы воспроизвести ошибку с воспроизводимым примером, который я принял из вашего ОП? Или вы ссылаетесь на более сложный R-скрипт? Если последнее, могут быть миллионы причин. Кроме того, какая настройка / sessionInfo()
?
– HenrikB
27 October 2017 в 20:21
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) { ... })
вызову.
В заключение: ничего волшебства не происходит, но понять это немного утомительно.