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."))
}
}