Ошибка при установке: невозможно принудительно привести тип "замыкание" к вектору типа "символ"
Попытался установить все пакеты, связанные с трещоткой, набрав:
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 опубликовал ответ в виде комментария, возможно, потому, что он надеется, что вы будете смотреть на разницу между вашим кодом и его и получить момент дзен. Он также считает, будучи скромным джентльменом, что он слишком прост, чтобы оправдать любые возражения. Так что я чувствую вину за то, что все противники - его, а не мои. Я сейчас попытаюсь законно заработать любые голоса.
Причиной того, что вы получили ошибку, было 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
Функция, упомянутая Беном, и прокрутка вниз по внутренним определениям функций, которые вы в конечном итоге получите к механизму, благодаря которому библиотека избегает этой ошибки:
if (!character.only)
package <- as.character(substitute(package))
Это также позволило бы избежать ошибки, которую я намеренно использовал в качестве примера:
> as.character(substitute(mean))
[1] "mean"
substitute
Функция выполняет обработку на элементе языка, принятом за замыкание, и результирующий объект, имя которого "R " имеет as.character
метод.