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

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

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 метод.

Другие вопросы по тегам