Ошибка при установке: не может принуждать тип "закрыть" к вектору типа "character"

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

install.packages(rattle, dependencies = c("Depends","Suggests"))

и получил это

Installing package into ‘C:/Users/Hooman/Documents/R/win-library/3.1’
(as ‘lib’ is unspecified)
Error in as.character(x) : 
  cannot coerce type 'closure' to vector of type 'character'

Я уже установил два отдельных пакета в этой папке и не имел проблем.

Ответ 1

@BenBolker отправил ответ в качестве комментария, возможно, потому, что он надеется, что вы будете смотреть на разницу между вашим кодом и его и получить Zen-момент. Он также считает, что он скромный джентльмен, что он слишком прост, чтобы оправдать какие-либо авансы. Поэтому я чувствую себя виноватым в том, что любые авансы - это его, а не мои. Теперь я попытаюсь законно заработать какие-либо авансы.

Причина, по которой вы получили сообщение об ошибке, заключалась в том, что функция install.packages ожидает объект символа, в то время как вы дали ему неуказанное выражение rattle. Бен использует один символ символа элемента "rattle", что соответствует требованию функции. В отличие от некоторых функций install.packages не оборудован для обеспечения "нестандартной оценки" его первого аргумента.

R - время от времени забавный язык с некоторыми противоречивыми соглашениями об оценке. Существует несколько функций, в которых вы можете предоставить выражение без кавычек и автоматически преобразовать его в символ. Список включает library и его двоюродный брат require, а также help, subset и $. Они считаются "нестандартной" оценкой хорошо осведомленными пользователями, и у них могут быть проблемы с программированием. Сообщение об ошибке сообщает вам, что R пытался преобразовать то, что он "думал", это объект языка, закрытие (которое свободно является термином R и LiSP для функции), персонажу и не получилось. Вы можете увидеть ту же ошибку при взаимодействии с консолью:

> as.character(mean)
Error in as.character(mean) : 
  cannot coerce type 'closure' to vector of type 'character'

Если вы посмотрите на функцию library, упомянутую Ben и прокрутите вниз по внутренним определениям функций, вы в конечном итоге получите механизм, при котором библиотека избегает этой ошибки:

if (!character.only) 
            package <- as.character(substitute(package))

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

> as.character(substitute(mean))
[1] "mean"

Функция substitute выполняет обработку на элементе языка, принятом как замыкание, и результирующий объект R "name" имеет метод as.character.