sha*_*ker 31 namespaces packages r
有没有办法在R中导入一个包含其他名称的包,就像你import as在Python中那样,例如import numpy as np?我最近开始使用package::function以避免Hmisc::summarize和之间的冲突plyr::summarize.
我希望能够分别写h::summarize和p::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此.
另请注意,使用此方法无法访问存储在程序包中的数据对象.
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等
使用名称空间包来生成另一个名称空间,该名称空间是您感兴趣的名称空间。
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)
请注意,这具有使脚本的软件包版本控制/安装要求更加不透明的缺点。
\n\n我希望能够分别编写 h::summarize 和 p::summarize 。这在 R 中可能吗?
\n
您可以使用\xe2\x80\x98框\xe2\x80\x99:
\nbox::use(\n h = Hmisc,\n p = plyr,\n)\n\nh$summarize(\xe2\x80\xa6)\np$summarize(\xe2\x80\xa6)\nRun Code Online (Sandbox Code Playgroud)\n但box::use提供的灵活性远不止于此。它\xe2\x80\x99 是满足您所有代码重用需求的一站式商店。例如,您还可以决定从一个包中导入所有名称,并重命名一些符号;例如:
box::use(\n h = Hmisc,\n plyr[..., p_summarize = summarize],\n)\nRun 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。
此外,请注意,与library附加不同的是,附加发生在本地。例如,您可以使用上面的box::use在函数内使用上述声明。\xe2\x80\x98plyr\xe2\x80\x99 则仅在函数内部为 \xe2\x80\x9catched\xe2\x80\x9d 。在函数之外,代码不受影响。