R中的“import as”

xkftehaa  于 2023-04-09  发布在  其他
关注(0)|答案(7)|浏览(130)

有没有一种方法可以在R中导入另一个名称的包,就像在Python中导入import as一样,例如import numpy as np?我最近开始使用package::function来避免Hmisc::summarizeplyr::summarize之间的冲突。
我希望能够分别写h::summarizep::summarize。这在R中可能吗?

gk7wooem

gk7wooem1#

这并不是你想要的,因为它涉及到从::符号到$符号的更改,但是如果你加载一个包命名空间(没有附加它),你可以通过它的环境名称来引用它:

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
还请注意,使用此方法时,您无权访问存储在包中的数据对象。

vlurs2pr

vlurs2pr2#

这里有一个只用于交互模式的解决方案:修改::,使其可以接受字符包名称,然后编写一个函数来注册别名。

`::` <- 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
tyg4sfes

tyg4sfes3#

与其给包起别名,为什么不给函数起别名呢?

hsumm <- Hmisc::summarize
dsumm <- dplyr::summarize
psumm <- plyr::summarize

我开始走eval(parse())的道路,但我遇到了麻烦,需要回去工作。@托马斯的答案似乎以一种更流畅的方式得到了类似的结果,但这里是非工作草案。

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等。

bvhaajcl

bvhaajcl4#

使用namespace包生成另一个别名为您感兴趣的名称空间的名称空间。

library(namespace)
registerNamespace('ggp', loadNamespace('ggplot2'))
data(iris)
ggp::ggplot(iris, ggp::aes(x = Petal.Length, y = Sepal.Length)) + ggp::geom_point()

请注意,这有一个缺点,即使软件包版本控制/安装要求对脚本更加不透明。

cig3rfwq

cig3rfwq5#

太长了,不适合在评论框中,所以伪答案:
如果只有几个(或几十个)函数,那么重写 Package 函数如何,例如。

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//)
       )
}
vhmi4jdf

vhmi4jdf6#

我希望能够分别写h::summarize和p::summarize。这在R中可能吗?
您可以使用**'box'**:

box::use(
  h = Hmisc,
  p = plyr,
)

h$summarize(…)
p$summarize(…)

但是box::use提供了更多的灵活性,它是您所有代码重用需求的一站式商店,例如,您还可以决定从一个包中导入所有名称并重命名其中的一些符号;例如:

box::use(
  h = Hmisc,
  plyr[..., p_summarize = summarize],
)

这允许您使用'Hmisc'名称,如前所述,使用前缀h$,以及所有来自'plyr' * 的名称,而不使用 * 前缀任何东西(它们是附加的);除了plyr::summarize之外,它已经以别名p_summarize连接。
此外,请注意,与library不同,附加发生在 * 本地 *。例如,您可以在函数内部使用上面的box::use声明。'plyr'仅在函数内部“附加”。在函数外部,代码不受影响。

dy1byipe

dy1byipe7#

有一个R包,名字很贴切,import,我相信它提供了类似Python的功能。
import package小插曲的链接
还有another link with some introduction
最后,一些关于高级用法的更多信息

相关问题