Проблемы при создании пакета R (принудительно добавленные NA)

Я написал пакет Boggler, который включает в себя Play.Boggle(), которая вызывает в строке 87 индикатор выполнения с использованием shell:

shell(cmd = sprintf('Rscript.exe R/progress_bar.R "%i"', time.limit + 1), wait=FALSE)

Все работает нормально при поиске файлов по отдельности и последующем вызове основной функции Play.Boggle(), но когда я пытаюсь проверить/собрать пакет (под Win7-64 с использованием RStudio), я получаю сообщение об ошибке - вот что сообщает 00install.out:

** preparing package for lazy loading
Warning in eval(expr, envir, enclos) : NAs introduced by coercion
Error in time.limit:0 : NA/NaN argument

Чтобы убедиться, что аргумент "%i" (time.limit + 1) был правильно передан в progress_bar.R, я добавил в скрипт cat(time.limit) (остальное закомментировал, чтобы убедиться, что пакет будет собран без ошибок) и направил его вывод в файл журнала, как это:

'Rscript.exe R/progress_bar.R "%i" > out.log'

Вывод: срок действительно пройден, как и ожидалось. Поэтому я не могу понять, почему я получаю это сообщение об ошибке "аргумент NA/NaN". Это должно быть как-то связано с ленивой загрузкой, концепцией, которую я еще не полностью понял.

Итак, мой вопрос: что я могу сделать, чтобы успешно проверить/собрать этот пакет с полной функциональностью (включая progress_bar.R)?

Примечание. На github есть скрипт progress_bar.R, но все его содержимое закомментировано, чтобы пакет можно было успешно установить. Вызов функции оболочки(...) по-прежнему активен, ничего не делая, кроме выполнения пустого скрипта.


person Dominic Comtois    schedule 06.03.2015    source источник
comment
Почему вы создаете свою командную панель таким запутанным образом? Вместо вызова сценария вы должны сделать содержимое progress_bar.R функцией в вашем пакете. Предупреждение, вероятно, создано из time.limit <- as.numeric(commandArgs(trailingOnly = TRUE)[1]).   -  person Roland    schedule 12.03.2015
comment
Запутанный в каком смысле? Мне нравится графический аспект панели прогресса tk, и я не могу просто вызвать функцию, так как этот процесс монополизирует интерпретатор — его нужно так или иначе запускать параллельно.   -  person Dominic Comtois    schedule 12.03.2015
comment
ни time.limit, ни кавычки тут не причем, я это уже тщательно проверил; Я имею в виду, что если я закомментирую только часть tk скрипта progress_bar.R, все будет работать нормально. Кроме того, не забывайте, что поиск файлов по отдельности, без упаковки всего, работает отлично (включая индикатор выполнения).   -  person Dominic Comtois    schedule 12.03.2015
comment
Насколько я знаю, все файлы .R получаются при сборке пакета. Кто знает, что тогда вернет commandArgs...   -  person Roland    schedule 12.03.2015
comment
Да, это как-то связано с этим, но я не уверен, что он делает. Ссылка на NaN кажется мне довольно загадочной. Хотя у меня только идея...   -  person Dominic Comtois    schedule 12.03.2015
comment
Это не загадочно. commandArgs(trailingOnly = TRUE)[1] нельзя преобразовать в числовое, в результате чего получится NA из as.numeric. Таким образом, : говорит вам, что ему было передано значение NA. Вместо вызова shell я бы использовал package parallel для распараллеливания.   -  person Roland    schedule 12.03.2015
comment
Я совершенно не согласен. Как и ожидалось, он превращается в числовое, но не при построении. Я просто добавил условие, что if(time.limit %in% c(NA, NaN)), я устанавливаю для time.limit какое-то минимальное число. И сейчас строится.   -  person Dominic Comtois    schedule 12.03.2015
comment
Ну а если тебя это устраивает... Я все же думаю, ты подходишь не лучшим образом к этому.   -  person Roland    schedule 12.03.2015


Ответы (1)


Таким образом, проблема возникает при попытке построить или проверить, и в этом случае все R-скрипты выполняются, как указал Роланд. Простой обходной путь позволяет без проблем проверить/собрать пакет. Исправление состоит в том, чтобы просто добавить к progress_bar.R следующие строки после того, как он попытается восстановить commandargs (строки 10-11):

if(time.limit %in% c(NA, NaN))
  time.limit <- 10 # or any minimal number

Наверняка есть и другие способы сделать это. Но так как это игра, запрограммированная для развлечения, я с радостью пойду с этим патчем. Надеюсь, это может помочь кому-то в будущем, и я не потрачу 50 драгоценных очков репутации напрасно за эту награду! :D

person Dominic Comtois    schedule 12.03.2015