Синтаксис для загрузки и установки библиотек.
Я был активным пользователем R
уже несколько лет, и что-то меня всегда путало. При установке пакетов (например, dplyr
) необходимо указать имя пакета как строку i.e.
install.packages("dplyr")
Вместо
install.packages(dplyr)
Это имеет смысл для меня, поскольку "dplyr"
будет передаваться как имя пакета, а не как объект, что будет подразумеваться dplyr
без кавычек.
Однако, когда мы идем загружать библиотеку, как строка, так и версия объекта проходят и загружают пакет. Оба из них правильно загружают пакет:
library("dplyr")
detach("package:dplyr", unload=TRUE)
library(dplyr)
В моей рабочей области нет объекта с именем dplyr
, и я не понимаю, почему эти две функции base
имели бы другой синтаксис. Я также не понимаю, почему версия без кавычек не будет оценивать объект. Например
dplyr <- "mada"
install.packages(dplyr)
library(dplyr)
Вышеуказанная устанавливает mada
, но загружает dplyr
, хотя dplyr
- это объект, который оценивается как "mada"
. Обратите внимание, что я работаю в RStudio
v.0.99.467 на Mac OS 10.10.4, если это имеет значение.
Есть ли причина для этого или просто потому, что функции работают по-другому?
Ответы
Ответ 1
library
функция принимает пакет name
как первый аргумент. Этот name
фактически ссылается на имя, переданное как аргумент пакета, а не на любое значение, связанное с этим именем. library
функция внутренне преобразует аргумент пакета в литерал символа (кроме случаев, когда character.only
установлен на TRUE
).
Итак,
plyr <- "dplyr"
library(plyr)
пройдет
if(!character.only)
package <- as.character(substitute(plyr))
чтобы стать
package <- "plyr"
install.packages
принимает вектор символов как имя пакетов, которые будут установлены.
dd <- "plyr"
install.packages(dd)
Это установит plyr
.
Это потому, что install.packages
не делает такого преобразования с аргументом pkgs
. Таким образом, install.packages
устанавливает, к чему относится pkgs
.
Ответ 2
Если вы просмотрите исходный код для ?library
, вы увидите на строке 230 нажмите здесь:
if (!character.only)
package <- as.character(substitute(package))
Имя пакета, которое пользователь поставляет, принудительно привязано к символу:
pkgname <- paste("package", package, sep = ":")
Это то, что позволяет вводить без кавычек для библиотеки. install.packages
не имеет одинаковой функциональности.
Ответ 3
Я не понимаю, почему эти две базовые функции будут иметь разный синтаксис.
Сложно рассуждать о причинах конкретных решений по языковому дизайну. Решение разрешить имена без кавычек для вызова library
подверглось критике со стороны многих известных программистов R как нелогичное, непоследовательное и ненужное, но мы здесь.
Помимо аргумента, что его (незначительно) более удобно не вводить кавычки, другая потенциальная причина похожа на другие языки: например, в Python вы import
библиотеки, указав их имя так: import lib_name
, not import 'lib_name'
. Это побуждает авторов библиотек выбирать имена библиотек, которые являются допустимыми идентификаторами на языке (в Python загруженные библиотеки - это объекты, которые вам нужно сослаться). Это менее актуально в R, где вы редко ссылаетесь на библиотеку, кроме ее загрузки.
Я также не понимаю, почему версия без кавычек не будет оценивать объект.
Поскольку R позволяет нестандартную оценку. В частности, аргументы функции оцениваются только тогда, когда они упоминаются, а не раньше:
f = function (arg) {}
f(stop('this won’t raise an error!'))
arg
никогда не используется, поэтому никогда не оценивается.
В случае library
аргумент также не оценивается. Вместо этого его использовали в неоценимой форме через substitute(package)
.
Ответ 4
Если вы хотите загрузить mada
вместо dplyr
в свой пример, попробуйте использовать опцию character.only = TRUE
dplyr <- "mada"
install.packages(dplyr)
library(dplyr, character.only=TRUE)
Дополнительную информацию см. в документации ?library
.