有没有一种方法可以在R中导入另一个名称的包,就像在Python中导入import as一样,例如import numpy as np?我最近开始使用package::function来避免Hmisc::summarize和plyr::summarize之间的冲突。我希望能够分别写h::summarize和p::summarize。这在R中可能吗?
import as
import numpy as np
package::function
Hmisc::summarize
plyr::summarize
h::summarize
p::summarize
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。还请注意,使用此方法时,您无权访问存储在包中的数据对象。
?
? p$summarise
? plyr::summarise
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
tyg4sfes3#
与其给包起别名,为什么不给函数起别名呢?
hsumm <- Hmisc::summarize dsumm <- dplyr::summarize psumm <- plyr::summarize
我开始走eval(parse())的道路,但我遇到了麻烦,需要回去工作。@托马斯的答案似乎以一种更流畅的方式得到了类似的结果,但这里是非工作草案。
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等。
p..ddply
bvhaajcl4#
使用namespace包生成另一个别名为您感兴趣的名称空间的名称空间。
library(namespace) registerNamespace('ggp', loadNamespace('ggplot2')) data(iris) ggp::ggplot(iris, ggp::aes(x = Petal.Length, y = Sepal.Length)) + ggp::geom_point()
请注意,这有一个缺点,即使软件包版本控制/安装要求对脚本更加不透明。
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//) ) }
vhmi4jdf6#
我希望能够分别写h::summarize和p::summarize。这在R中可能吗?您可以使用**'box'**:
box::use( h = Hmisc, p = plyr, ) h$summarize(…) p$summarize(…)
但是box::use提供了更多的灵活性,它是您所有代码重用需求的一站式商店,例如,您还可以决定从一个包中导入所有名称并重命名其中的一些符号;例如:
box::use
box::use( h = Hmisc, plyr[..., p_summarize = summarize], )
这允许您使用'Hmisc'名称,如前所述,使用前缀h$,以及所有来自'plyr' * 的名称,而不使用 * 前缀任何东西(它们是附加的);除了plyr::summarize之外,它已经以别名p_summarize连接。此外,请注意,与library不同,附加发生在 * 本地 *。例如,您可以在函数内部使用上面的box::use声明。'plyr'仅在函数内部“附加”。在函数外部,代码不受影响。
h$
p_summarize
library
dy1byipe7#
有一个R包,名字很贴切,import,我相信它提供了类似Python的功能。import package小插曲的链接还有another link with some introduction最后,一些关于高级用法的更多信息
import
7条答案
按热度按时间gk7wooem1#
这并不是你想要的,因为它涉及到从
::
符号到$
符号的更改,但是如果你加载一个包命名空间(没有附加它),你可以通过它的环境名称来引用它:但是,请注意,使用标准
?
表示法确实会失去对文档文件的访问权限(例如,? p$summarise
不起作用)。因此,它可以很好地为您提供速记,但对于交互式使用可能不是很好,因为您仍然必须求助于? plyr::summarise
。还请注意,使用此方法时,您无权访问存储在包中的数据对象。
vlurs2pr2#
这里有一个只用于交互模式的解决方案:修改
::
,使其可以接受字符包名称,然后编写一个函数来注册别名。但是,除了使用别名,您还可以重新定义
::
来查找与您的缩写匹配的包:tyg4sfes3#
与其给包起别名,为什么不给函数起别名呢?
我开始走
eval(parse())
的道路,但我遇到了麻烦,需要回去工作。@托马斯的答案似乎以一种更流畅的方式得到了类似的结果,但这里是非工作草案。你可以做一些
创建
p..ddply
等。bvhaajcl4#
使用namespace包生成另一个别名为您感兴趣的名称空间的名称空间。
请注意,这有一个缺点,即使软件包版本控制/安装要求对脚本更加不透明。
cig3rfwq5#
太长了,不适合在评论框中,所以伪答案:
如果只有几个(或几十个)函数,那么重写 Package 函数如何,例如。
vhmi4jdf6#
我希望能够分别写h::summarize和p::summarize。这在R中可能吗?
您可以使用**'box'**:
但是
box::use
提供了更多的灵活性,它是您所有代码重用需求的一站式商店,例如,您还可以决定从一个包中导入所有名称并重命名其中的一些符号;例如:这允许您使用'Hmisc'名称,如前所述,使用前缀
h$
,以及所有来自'plyr' * 的名称,而不使用 * 前缀任何东西(它们是附加的);除了plyr::summarize
之外,它已经以别名p_summarize
连接。此外,请注意,与
library
不同,附加发生在 * 本地 *。例如,您可以在函数内部使用上面的box::use
声明。'plyr'仅在函数内部“附加”。在函数外部,代码不受影响。dy1byipe7#
有一个R包,名字很贴切,
import
,我相信它提供了类似Python的功能。import package小插曲的链接
还有another link with some introduction
最后,一些关于高级用法的更多信息