R中的"import as"

sha*_*ker 31 namespaces packages r

有没有办法在R中导入一个包含其他名称的包,就像你import as在Python中那样,例如import numpy as np?我最近开始使用package::function以避免Hmisc::summarize和之间的冲突plyr::summarize.

我希望能够分别写h::summarizep::summarize.这可能在R?

Tho*_*mas 22

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

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
Run Code Online (Sandbox Code Playgroud)

但请注意,您确实无法使用标准?符号访问文档文件(例如,? p$summarise不起作用).因此,它可以作为速记使用,但可能不适合交互式使用,因为您仍然需要求助于? plyr::summarise此.

另请注意,使用此方法无法访问存储在程序包中的数据对象.

  • 这似乎无法通过 $ 运算符提供包数据。 (2认同)

Mat*_*rde 18

这是一个只应用于交互模式的解决方案.您修改::以便它可以接受字符包名称,然后编写一个函数来注册别名.

`::` <- 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
Run Code Online (Sandbox Code Playgroud)

但是,您可以重新定义::查找与您的缩写匹配的包,而不是使用别名:

`::` <- 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
Run Code Online (Sandbox Code Playgroud)


Gre*_*gor 13

而不是别名包,为什么不只是别名函数?

hsumm <- Hmisc::summarize
dsumm <- dplyr::summarize
psumm <- plyr::summarize
Run Code Online (Sandbox Code Playgroud)

我开始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)
    }
}
Run Code Online (Sandbox Code Playgroud)

想到你可以做类似的事情

package_alias("plyr", "p")
Run Code Online (Sandbox Code Playgroud)

创造p..ddply


And*_*w M 5

使用名称空间包来生成另一个名称空间,该名称空间是您感兴趣的名称空间。

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

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


Kon*_*lph 5

\n

我希望能够分别编写 h::summarize 和 p::summarize 。这在 R 中可能吗?

\n
\n

您可以使用\xe2\x80\x98\xe2\x80\x99

\n
box::use(\n  h = Hmisc,\n  p = plyr,\n)\n\nh$summarize(\xe2\x80\xa6)\np$summarize(\xe2\x80\xa6)\n
Run Code Online (Sandbox Code Playgroud)\n

box::use提供的灵活性远不止于此。它\xe2\x80\x99 是满足您所有代码重用需求的一站式商店。例如,您还可以决定从一个包中导入所有名称,并重命名一些符号;例如:

\n
box::use(\n  h = Hmisc,\n  plyr[..., p_summarize = summarize],\n)\n
Run Code Online (Sandbox Code Playgroud)\n

这允许您通过像以前一样使用 \xe2\x80\x98Hmisc\xe2\x80\x99 名称作为前缀h$,并且使用 \xe2\x80\x98plyr\xe2\x80\x99 中的所有名称而不用任何前缀(它们\xe2 \x80\x99已附);除了plyr::summarize,它已附加在别名下p_summarize

\n

此外,请注意,与library附加不同的是,附加发生在本地。例如,您可以使用上面的box::use在函数内使用上述声明。\xe2\x80\x98plyr\xe2\x80\x99 则仅在函数内部为 \xe2\x80\x9catched\xe2\x80\x9d 。在函数之外,代码不受影响。

\n