繁体   English   中英

从 [包] 导入 [功能] 在 R

[英]From [package] import [function] in R

使用 Python 或 R 中的数据,我们经常加载多个包。 在某些情况下,两个包(例如foobar )可能每个都包含一些 function (例如do_stuff )。

在 Python 中进行管理以防止歧义或意外的方式如下:

from foo import do_stuff
from bar import other_function    # (does not load/import do_stuff() from bar)

在 R 中,我看到的所有代码都只是使用多个library(package_name)语句导入整个包。 我认为这会导致非常难以捕获的错误。 例如,参见Reordering factor gives different results, depending on which packages are loaded 事实上,即使“没有屏蔽,因为 reorder.factor 不存在于基础中”,这也会发生。

我希望这个问题的一般答案类似于上面的from package import function代码,但事实并非如此。 事实上,接受的(也是唯一的)答案只是解释了问题存在的原因(而不是淡化该贡献)。 答案的评论中提供了一个解决方法,但该解决方法特定于该特定的 function( reorder )。

有没有一种通用的方法可以从 R 中的特定 package 导入特定的 function? 这样我就可以慎重而明确地知道我代码中所有 function 调用的来源,并确保它们按照我认为的方式进行?

从 R 4.0 开始,您还可以使用主library() function 执行此操作:

library(dplyr, include.only = c("select", "mutate"))
library(dplyr, exclude = c("filter", "lag"))

您可以使用package::function()构造明确告诉R哪个包应该用于给定的函数。 您甚至可以使用它来从未加载library包中调用函数。

library(dplyr) # Has a function called filter()
library(plyr) # Also has a filter() function

dplyr::filter(foo)
plyr::filter(bar)

如果你想确保最大限度地减少代码混淆的可能性,我强烈推荐使用conflicted包,这会强制你明确识别所有模糊函数调用的包: https//www.tidyverse.org/articles / 2018/06 /冲突/

您正在比较两种功能不同的语言。 首先,您可以使用::轻松地从包中引用函数,例如:

fortunes::fortune()

fortunes包中调用fortune功能。

但你也必须小心这样做。 因为取决于包的构造方式,最终可能会使用依赖于命名空间中的其他(非导出)函数的函数,但由于未加载命名空间,因此无法找到该函数。 我自己使用例如mgcv包的绘图功能遇到了这个问题。 这是使用library()附加包的一个原因,正如Andrew Breza在他的回答中所说明的那样。 至少使用:: construct调用的函数将按预期工作(99.9%的时间)。

但是你链接的问题不会被解决。 问题是“糟糕的设计”,包装作者认为他需要一种S3方法来重新排序因子而不是特定于他的包的类。 这样做为整个因子类注册了一个S3方法,因此改变了在一个因子上调用reorder()的每个函数的行为。

由于这个问题是由软件包开发人员自己造成的,除了自己黑客入侵S3系统以找到所需的实际方法之外,你几乎无法做到这一点。

虽然这个答案是正确的,但它对于诸如magrittr%>%%$%缀运算符magrittr import包有效:

import::from(magrittr, "%$%")

但显然可以用于任何功能:

import::from(foo, "do_stuff", "do_other_stuff")

请注意“[ import ]不适合与library一起使用。它的命名是为了调用import::from(pkg, fun1, fun2)这样的调用。” 有关详细信息,请参阅https://CRAN.R-project.org/package=import

基于 wjchulme 的回答,导入 package 还允许您从自己的脚本中导入函数或其他对象,使 R 具有模块化的感觉,很像 python 模块。

import::from(your_script.R, some_function, SOME_CONSTANT, and_whatever)

参考: https://cran.r-project.org/web/packages/import/vi.nettes/import.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM