在python中,我可以使用以下命令加载特定的功能或功能:
from x import y as z
我如何在R中复制这个?
例如,我想从count
加载 plyr
函数,
而不是使用library(plyr)
答案 0 :(得分:19)
我可能只是count <- plyr::count
,所以我不必费心去确保我的论点正确。
如果未安装plyr,您可能希望将该定义包装在if语句中:
if (requireNamespace("plyr"))
count <- plyr::count
else
stop("plyr is not installed.")
您也可能对import和/或modules包感兴趣,这些包为R提供类似python的导入/模块机制。
还注意Adding new generics section Writing R Extensions的警告(原始重点):
本手册的早期版本建议分配
foo.default <- base::foo
。 这是不一个好主意,因为它捕获了基本功能 [package]安装的时间,可能会在修补或更新R时更改。
如果在count <- plyr::count
脚本中定义了source
语法,那么可以使用df = pd.DataFrame(dic)
result = []
for i,d in df.iterrows():
temp = pd.DataFrame(d['data'], columns=['data', 'min', 'max'])
temp['var1'] = d['var1']
temp['var2'] = d['var2']
result += [temp]
pd.concat(result)
语法,但是你应该明确定义一个新函数并指定所有如果你在包中这样做的话。
答案 1 :(得分:10)
from plyr import count as count
可能如下所示:
count <- function(x) {
plyr::count(x)
}
简化为:
count <- plyr::count
更完整:
if (requireNamespace("plyr"))
count <- plyr::count
修改强>
我受@ eipi10评论的启发。我不知道::
感谢@Joshua Ulrich的建议!
答案 2 :(得分:6)
R中没有直接等效的功能,但正如其他答案所述,您可以获得类似的结果。
library
参数加载包名称空间,将附加到搜索列表中。正如Joshua Ulrich所述,可以加载一个包命名空间而不将将命名空间附加到搜索列表中。使用library
实际上会同时调用loadNamespace
和attachNamespace
。
加载与附加的区别最好由拥有丰富的软件包开发专业知识的人解释(前面提到的Ulrich先生会想到)所以我建议进一步阅读在Hadley Wickham的this write-up on namespaces中。
但是,值得注意的是,您可以使用pos
中的library()
参数来定义附加包名称空间的位置,如documentation for the library statement中所述。
答案 3 :(得分:2)
我偶然发现了这个问题,寻找相同的功能并使用上述方法,编写了一个快速功能来概括这个想法。我希望将来发布给所有在将来遇到这个问题的人。
import <- function(pkg, f) {
if (pkg %in% installed.packages()) {
assign(f, eval(parse(text = paste(pkg, "::", f, sep = ""))), envir = .GlobalEnv)
} else {
stop(paste(pkg, "is not installed."))
}
}
答案 4 :(得分:1)
您可以使用带有 library()
参数的内置 include.only
函数。
library(plyr, include.only = c("count"))
# Okay
count(mtcars, vars = "cyl")
#> cyl freq
#> 1 4 11
#> 2 6 7
#> 3 8 14
# Fails to find plyr::arrange()
arrange(mtcars, cyl, disp)
#> Error in arrange(mtcars, cyl, disp): could not find function "arrange"
由 reprex package (v0.3.0) 于 2021 年 2 月 9 日创建
答案 5 :(得分:1)
现在有一个包提供了这个确切的功能:'box'。1有了它,Python 的 from x import y as z
的 R 等价物是:
box::use(x[z = y])
<块引用>
例如,我想只从count
加载plyr
函数,而不是用library(plyr)
box::use(plyr[count])
还值得注意的是,与 library()
不同的是,box::use()
在本地附加名称。例如,要在不影响全局搜索路径的情况下在函数内附加包的所有名称,您可以编写
f = function () {
box::use(plyr[...])
# use it here.
}
([...]
告诉 box::use()
附加所有名称。)
值得注意的是,从 R 3.6 开始,library
还支持仅附加指定的名称:
library(plyr, include.only = 'count')
然而,这仍然执行全局附加,它不允许别名(即我不能将 plyr::count
导入为,例如,plyr_count
),并重复调用 library
相同的包名但不同的 include.only
列表不起作用(后续调用无效)。换句话说,它比 Python import
机制或 box::use()
的作用要小得多。
1 这个包是 Joshua 回答中提到的 ‘modules’ 包的后继者,但它使用了完全不同的语法并具有更多功能。