R-эквивалент Python `from x import y as z`

В python я могу загрузить определенную функцию или функцию с помощью:

from x import y as z

Как я могу воспроизвести это в R?

Например, я хочу загрузить только функцию count из plyr, вместо загрузки всего пакета с помощью library(plyr)

Ответы

Ответ 1

Я бы просто сделал count <- plyr::count, поэтому мне не пришлось бы беспокоиться о том, чтобы я правильно понял аргументы.

И вы можете обернуть это определение в инструкции if, если plyr не установлен:

if (requireNamespace("plyr"))
    count <- plyr::count
else
    stop("plyr is not installed.")

Также вас может заинтересовать import и/или modules, которые предоставляют python-подобные механизмы импорта/модуля для R.


Также прислушайтесь к предупреждению из Добавление нового раздела дженериков Написание R Расширения (исходный акцент):

В более ранних версиях этого руководства предлагается присвоить foo.default <- base::foo. Это не хорошая идея, так как она фиксирует базовую функцию на время установки [package] и может быть изменено с изменением или обновлением R.

Таким образом, было бы хорошо использовать синтаксис count <- plyr::count, если он определен в script вам source ing, но вы должны явно определить новую функцию и указать все аргументы, если вы сделаете это в пакет.

Ответ 2

from plyr import count as count может выглядеть так:

count <- function(x) {
    plyr::count(x)
}

Упрощенная:

count <- plyr::count

Более полно:

if (requireNamespace("plyr")) 
    count <- plyr::count

EDIT:

Я был вдохновлен комментарием @eipi10. Я не знал о ::
Спасибо @Joshua Ulrich за предложения!

Ответ 3

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

Аргумент library загружает пространство имен пакетов и привязывает его к списку поиска. Как отмечено Джошуа Ульрихом, можно загрузить пространство имен пакетов без привязки пространства имен к списку поиска. Использование library фактически вызывает как loadNamespace, так и attachNamespace.

Различие между загрузкой и присоединением лучше всего объясняется тем, кто обладает обширным опытом разработки пакетов (напомнил вышеупомянутый г-н Ульрих), поэтому я предлагаю читать далее эта запись на пространствах имен Хэдли Уикхем.

Однако стоит отметить, что вы можете использовать аргумент pos в library(), чтобы определить, где вы прикрепляете пространство имен пакетов, как описано в документация для утверждения библиотеки.

Ответ 4

Я просто наткнулся на этот вопрос, ища ту же функциональность и используя описанный выше подход, написал быструю функцию для обобщения идеи. Я хотел бы опубликовать его здесь для всех, кто столкнулся с этим вопросом в будущем.

import <- function(pkg, f) {
  if (pkg %in% installed.packages()) {
    assign(f, eval(parse(text = paste(pkg, "::", f, sep = ""))), envir = .GlobalEnv)
  } else {
    stop(paste(pkg, "is not installed."))
  }
}