Подтвердить что ты не робот

Синтаксис для загрузки и установки библиотек.

Я был активным пользователем 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, если это имеет значение. Есть ли причина для этого или просто потому, что функции работают по-другому?

4b9b3361

Ответ 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.