&引用;作为“进口”;在R

&引用;作为“进口”;在R,r,namespaces,packages,R,Namespaces,Packages,有没有一种方法可以在R中导入另一个名称的包,就像在Python中使用import as那样,例如import numpy as np?最近我开始使用package::function来避免冲突,比如说Hmisc::summary和plyr::summary 我希望能够分别编写h::summary和p::summary。这在R中可能吗?太长,无法很好地放在评论框中,所以伪答案: 如果只有几个(或几十个)函数,那么重写包装器函数如何 summarize<-function(whichone='

有没有一种方法可以在R中导入另一个名称的包,就像在Python中使用
import as
那样,例如
import numpy as np
?最近我开始使用
package::function
来避免冲突,比如说
Hmisc::summary
plyr::summary


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

太长,无法很好地放在评论框中,所以伪答案:

如果只有几个(或几十个)函数,那么重写包装器函数如何

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

summary与其给包添加别名,为什么不直接给函数添加别名呢

hsumm <- Hmisc::summarize
dsumm <- dplyr::summarize
psumm <- plyr::summarize
带着这样的想法你可以做

package_alias("plyr", "p")

要创建
p..ddply
等,这并不是您想要的,因为它涉及从
表示法更改为
$
表示法,但如果加载包命名空间(不附加它),则可以通过其环境名称引用它:

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
h Hmisc::汇总(鸢尾花$Sepal.Length,鸢尾花$Species,FUN=mean)
鸢尾属$种鸢尾属$萼片长
1 setosa 5.006
2花色5.936
3弗吉尼亚州6.588
>h$汇总(鸢尾花$萼片长度,鸢尾花$种类,乐趣=平均值)
鸢尾属$种鸢尾属$萼片长
1 setosa 5.006
2花色5.936
3弗吉尼亚州6.588
>总结(虹膜,x=平均值(萼片长度))
错误:找不到函数“摘要”
>plyr::总结(虹膜,x=平均值(萼片长度))
x
1 5.843333
>p$摘要(虹膜,x=平均值(萼片长度))
x
1 5.843333
但是,请注意,您确实无法使用标准的
符号访问文档文件(例如,
?p$summary
不起作用)。因此,它可以很好地为您提供速记功能,但对于交互式使用可能不是很好,因为您仍然需要求助于
?plyr::对此进行总结


还请注意,使用这种方法,您无法访问包中存储的数据对象。

这里有一个解决方案,该解决方案应仅用于交互模式。您可以修改
,以便它可以接受字符包名称,然后编写一个函数来注册别名

`::` <- 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
使用该包生成另一个别名为您感兴趣的名称空间

library(namespace)
registerNamespace('ggp', loadNamespace('ggplot2'))
data(iris)
ggp::ggplot(iris, ggp::aes(x = Petal.Length, y = Sepal.Length)) + ggp::geom_point()
注意,这样做的缺点是使脚本的包版本控制/安装要求更加不透明

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

您可以使用

box::使用(
h=Hmisc,
p=plyr,
)
h$汇总(…)
p$汇总(…)
但是,
box::use
提供了比这更大的灵活性。它是满足所有代码重用需求的一站式服务。例如,您还可以决定从一个包中导入所有名称,并重命名其符号;例如:

box::使用(
h=Hmisc,
plyr[…,p_summary=summary],
)
这允许您使用“Hmisc”名称,如前所述,在其前面加上
h$
,并且“plyr”中的所有名称都不加任何前缀(已附加);除了
plyr::summary
,它已附加在别名
p\u summary


此外,请注意,与
库不同,附加是在本地进行的。例如,您可以在函数中使用上面的
框::use
声明plyr'仅在功能内部“附加”。在函数之外,代码不受影响。

这是用于包中的吗?不,我只是不想要腕管(
expression()
是我最喜欢的函数),而且我也不喜欢不可预知的错误。虽然最终我确实计划在软件包上工作,所以如果在这种情况下有单独的考虑,我想听听他们的意见。你真的经常遇到这样的冲突吗?或者这只是几个软件包中你最喜欢的几个功能?这只是我不止一次遇到的问题。我也倾向于为个人使用编写大量屏蔽和包装函数,有时会导致不可预见的冲突。这些都是您可能遇到的最可预测的错误。对于汇总,您可以在plyr中使用
summary
,在Hmisc中使用
summary
。为避免显式地
Hmisc::
”而保存三到四个字符是愚蠢的。更好的方法是使用
expr
填充其余部分,这也将显示它们所在的包。我会喜欢我的腕管,写几次
package::function
。谢谢,但我想这个问题的重点是避开你必须知道哪些函数冲突的部分。我知道您可以使用
冲突
,但这可能会让人恼火,而且不会产生健壮的代码(防止将来的重叠)。仅供参考,
参数非常方便,因为我不想这样做。请看我对另一个答案的评论;它仍然不是一个健壮的通用解决方案。也就是说,我不是在寻找解决方法。如果你错过了函数调用中的标点符号,你可以使用
h..summarize。我只想说,我回到这个问题上来,我比第一次看到它时更喜欢这个答案+1实用性。这就是我想要的。这也是
substitute()
实际作用的一个很好的例子。尝试神奇地计算一个参数是否应该求值是一个很好的想法。@hadley我已经更新了我的答案,因此它不能在函数中使用。要从命令行使用,输入
后,我希望包内容名称会显示出来。不幸的是,他们没有出现。它与公认的答案一致。很好<代码>按此方式导入\u
`::` <- 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
library(namespace)
registerNamespace('ggp', loadNamespace('ggplot2'))
data(iris)
ggp::ggplot(iris, ggp::aes(x = Petal.Length, y = Sepal.Length)) + ggp::geom_point()