Что такое двойные двоеточия (: :) в R?

Я следую руководству в Rbloggers и обнаружил использование двойных двоеточий, я поискал в Интернете, но не смог найти объяснения их использованию. Вот пример их использования.

df <- dplyr::data_frame(
  year = c(2015, NA, NA, NA), 
  trt = c("A", NA, "B", NA)
)

Я понимаю, что это создает фрейм данных, но я не понимаю их цели.


person Luis Candanedo    schedule 06.02.2016    source источник
comment
см. файлы помощи ... ?'::'   -  person user20650    schedule 06.02.2016
comment
Спасибо, я не знал, как получить доступ к справке по персонажам в R!   -  person Luis Candanedo    schedule 06.02.2016
comment
help("::") также можно использовать, если ? доставляет вам неприятности. Функции всегда можно записывать в кавычки.   -  person Rich Scriven    schedule 06.02.2016
comment
Сильно связано: Хорошая практика - вызывать функции в пакете через ::   -  person Gregor Thomas    schedule 06.02.2016


Ответы (2)


Как вы, наверное, уже просматривали справочную страницу, использование :: помогает получить доступ к конкретной функции из этого конкретного пакета. При загрузке dplyr вы, вероятно, получили следующее сообщение ..

The following objects are masked from ‘package:base’:
       intersect, setdiff, setequal, union

Так, например, если вы хотите использовать функцию intersect из dplyr или базового пакета, вам нужно указать, используя :: двойные двоеточия. Использование будет следующим

mtcars$model <- rownames(mtcars)
first <- mtcars[1:20, ]
second <- mtcars[10:20, ]
dplyr::intersect(first, second)
base::intersect(first, second)

Обновление: добавлено дополнительное объяснение

Примечание. Последовательность загрузки библиотек определяет приоритетный доступ к определенным функциям. Разработчики разных пакетов обычно используют одни и те же имена функций. Однако, когда R встречает функцию, он последовательно запускает различные библиотеки, загруженные в конкретном сеансе. Вы можете проверить пакеты в сеансе, запустив (.packages())

 [1] "tidyr"      "data.table" "dplyr"      "stats"     
 [5] "graphics"   "grDevices"  "utils"      "datasets"  
 [9] "methods"    "base"    

Как вы можете видеть в моем примере сеанса выше, tidyr - это последняя загруженная мной библиотека, т.е. первая запись сеанса r. Итак, когда вы используете любую функцию в своем коде, сначала ищется в tidyr -> затем data.table -> затем dplyr и так далее, наконец, ищется пакет base. Таким образом, в этом процессе, когда имя функции перекрывается между пакетами, тот, который загрузил последние, маскирует предыдущие. Чтобы избежать этого маскирования, вы указываете в коде R, где искать функцию. Следовательно, здесь base::intersect будет использовать функцию из базовой библиотеки вместо dplyr. В качестве альтернативы вы можете использовать, чтобы избежать загрузки полной библиотеки. В этом есть как положительные, так и отрицательные стороны. Прочтите ссылки и узнайте больше.

запустить и проверить отличия. Вот несколько ресурсов, которые помогут вам разобраться.

Сравнить библиотеки (), require (), ::

Пространство имен

person user5249203    schedule 06.02.2016
comment
Лучше использовать search(), чем .packages(), поскольку имена могут также разрешаться в прикрепленный список / среды / и т. Д. - person ctbrown; 22.05.2018
comment
Этот ответ не проясняет очень важный момент: вы должны установить пакет, чтобы его функции были доступны для извлечения с использованием ::. (Но вам не нужно иметь загруженный этот пакет) - person Mobeus Zoom; 10.06.2020

В нескольких пакетах может быть несколько функций с одним и тем же именем. Оператор двойного двоеточия позволяет указать конкретную функцию, которую вы хотите:

package::functionname
person CPhil    schedule 06.02.2016