2015-06-05 4 views
4

До сих пор я использовал этот кусок кода для загрузки пакетов R и записи файлов .R. Но я пытаюсь использовать knitrКак я могу установить пакеты в knitr?

rm (list=ls(all=TRUE)) 
kpacks <- c('ggplot2','install_github','devtools','mapdata') 
new.packs <- kpacks[!(kpacks %in% installed.packages()[,"Package"])] 
if(length(new.packs)) install.packages(new.packs) 
lapply(kpacks, require, character.only=T) 
remove(kpacks, new.packs) 
options(max.print=5.5E5) 

Но теперь, когда я положил этот кусок кода в документе Knitr, я получаю эту ошибку:

Error in contrib.url(repos, "source") : 
    trying to use CRAN without setting a mirror calls:...... 

Как я могу это исправить?

ответ

5

Узкий ответ на ваш вопрос, что вы должны установить repos вариант:

options(repos=c(CRAN="<something sensible near you>")) 

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

В более широком смысле, я бы поставил под вопрос, хотите ли вы включить такие вещи в свой код R; при некоторых обстоятельствах это может быть проблематично.

  • что делать, если у пользователя нет сетевого подключения?
  • Что делать, если они географически очень далеки от вас, так что ваш репозиторий по умолчанию не имеет смысла?
  • Что делать, если они не хотят загружать и устанавливать (возможно, большой) пакет?

Моя предпочтительная практика заключается в том, чтобы указывать в инструкциях по запуску кода, в котором должны быть установлены пакеты X, Y, Z (и предоставить им примерный код для их установки, если они неопытные с R).

+0

спасибо. Имеет смысл. Я делаю это так, чтобы пользователям не приходилось вкладывать свои мозги в пакеты загрузки. Интернет не является проблемой. – maximusdooku

1

Один из способов избежать установки пакетов, чтобы сделать что-то вроде

if(!require(package.name)) 
    stop("you need to install package.name") 

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

+1

это уже обрабатывается в коде OP, проверяя список пакетов для установки на 'installed.packages()' ... –

+0

@Ben, это правда, но мое предложение больше связано с общением с пользователем, а не с установкой пакетов. Использование ряда 'if (! Require())' операторов помогает адресовать различные пункты, которые вы указали, когда спрашиваете, является ли хорошая идея иметь документ 'knitr', пытающийся принудительно установить пакеты R, сохраняя при этом все пользователь. – mikeck

Смежные вопросы