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

"импорт как" в R

Есть ли способ импортировать пакет с другим именем в R, как вы могли бы с import as в Python, например. import numpy as np? Я начал использовать package::function в последнее время, чтобы избежать конфликтов между, скажем, Hmisc::summarize и plyr::summarize.

Я хотел бы иметь возможность вместо этого писать h::summarize и p::summarize соответственно. Возможно ли это в R?

4b9b3361

Ответ 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//)
       )
}