"импорт как" в R
Есть ли способ импортировать пакет с другим именем в R, как вы могли бы с import as
в Python, например. import numpy as np
? Я начал использовать package::function
в последнее время, чтобы избежать конфликтов между, скажем, Hmisc::summarize
и plyr::summarize
.
Я хотел бы иметь возможность вместо этого писать h::summarize
и p::summarize
соответственно. Возможно ли это в R?
Ответы
Ответ 1
Используйте пакет пространства имен, чтобы сгенерировать другое пространство имен, псевдоним которого интересует вас.
library(namespace)
registerNamespace('ggp', loadNamespace('ggplot2'))
data(iris)
ggp::ggplot(iris, ggp::aes(x = Petal.Length, y = Sepal.Length)) + ggp::geom_point()
Обратите внимание, что это имеет недостаток в том, что делает требования к версиям/установке пакета более непрозрачными для сценариев.
Ответ 2
Это не совсем то, что вам нужно, поскольку оно связано с изменением нотации ::
на ноту $
, но если вы загружаете пространство имен пакетов (без его присоединения), вы можете ссылаться на него по названию своей среды:
h <- loadNamespace('Hmisc')
p <- loadNamespace('plyr')
> summarize(iris$Sepal.Length, iris$Species, FUN=mean)
Error: could not find function "summarize"
> Hmisc::summarize(iris$Sepal.Length, iris$Species, FUN=mean)
iris$Species iris$Sepal.Length
1 setosa 5.006
2 versicolor 5.936
3 virginica 6.588
> h$summarize(iris$Sepal.Length, iris$Species, FUN=mean)
iris$Species iris$Sepal.Length
1 setosa 5.006
2 versicolor 5.936
3 virginica 6.588
> summarise(iris, x = mean(Sepal.Length))
Error: could not find function "summarise"
> plyr::summarise(iris, x = mean(Sepal.Length))
x
1 5.843333
> p$summarise(iris, x = mean(Sepal.Length))
x
1 5.843333
Обратите внимание, однако, что вы теряете доступ к файлам документации, используя стандартную нотацию ?
(например, ? p$summarise
не работает). Таким образом, он будет служить вам хорошо, как сокращение, но может быть не очень полезно для интерактивного использования, так как вам все равно придется прибегать к ? plyr::summarise
для этого.
Обратите внимание также, что вы не имеете доступа к объектам данных, хранящимся в пакете, используя этот подход.
Ответ 3
Здесь решение, которое должно использоваться только для интерактивного режима. Вы изменяете ::
, чтобы он мог принимать имена пакетов символов, а затем записывать функцию для регистрации псевдонимов.
`::` <- function(pkg, name) {
sym <- as.character(substitute(pkg))
pkg <- tryCatch(get(sym, envir=.GlobalEnv), error=function(e) sym)
name <- as.character(substitute(name))
getExportedValue(pkg, name)
}
pkg.alias <- function(alias, package) {
assign(alias, package, .GlobalEnv)
lockBinding(alias, .GlobalEnv)
}
pkg.alias('r', 'reshape2')
r::dcast
Но вместо использования псевдонимов вы также можете переопределить ::
, чтобы найти пакет, соответствующий вашему сокращению:
`::` <- function(pkg, name) {
pkg <- as.character(substitute(pkg))
pkg <- installed.packages()[grepl(paste0('^', pkg), installed.packages())]
name <- as.character(substitute(name))
getExportedValue(pkg, name)
}
ggp::ggplot
Ответ 4
Вместо того, чтобы наложить псевдоним пакета, почему бы просто не использовать функцию?
hsumm <- Hmisc::summarize
dsumm <- dplyr::summarize
psumm <- plyr::summarize
Я начал путь eval(parse())
, но у меня возникли проблемы и вам нужно было вернуться к работе. Ответ @Thomas кажется похожим результатом более плавным способом, но здесь нерабочий проект.
package_alias <- function(package, alias, infix = "..") {
funs <- ls(paste0("package:", package))
for (i in seq_along(funs)) {
assign(paste0(alias, infix, funs[i]),
value = eval(parse(text = funs[i])), envir = .GlobalEnv)
}
}
С идеей, что вы можете сделать что-то вроде
package_alias("plyr", "p")
создать p..ddply
и т.д.
Ответ 5
Слишком долго, чтобы хорошо вписываться в поле комментариев, поэтому псевдо-ответ:
Если это всего лишь несколько (или несколько десятков) функций, как насчет функции обертки переопределения, например.
summarize<-function(whichone='h',//all variables for either "summarize"// ) {
switch(whichone,
'h' = Hmisc::summarize(//all the appropriate variables//),
'p' = plyr:: summarize(//all the appropriate variables//)
)
}