来自R中的[package] import [function]

Max*_*wer 7 encapsulation namespaces r function

使用Python或R中的数据,我们经常加载几个包.在某些情况下,两个包(例如foobar)可能各自包含一些功能(例如do_stuff).

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

from foo import do_stuff
from bar import other_function    # (does not load/import do_stuff() from bar)
Run Code Online (Sandbox Code Playgroud)

在R中,我看到的所有代码都只导入包含多个library(package_name)语句的整个包.我认为这会导致非常难以捕获的错误.例如,请参阅重新排序因子给出不同的结果,具体取决于加载的包.事实上,即使"没有掩蔽,因为在基础中不存在reorder.factor",也会发生这种情况.

我希望这个问题的一般答案与from package import function上面的代码类似,但事实并非如此.事实上,公认的(也是唯一的)答案只能解释为什么存在这个问题(而不是淡化这种贡献).答案的评论中提供了一种解决方法,但该解决方法特定于该特定函数(reorder).

有一般的方法我只能导入R中特定包的特定功能吗?因此,我可以有意识地明确我的代码中的所有函数调用来自何处,并确保它们执行我认为他们正在做的事情?

小智 22

从 R 4.0 开始,您还可以使用 mainlibrary()函数来执行此操作:

library(dplyr, include.only = c("select", "mutate"))
library(dplyr, exclude = c("filter", "lag"))
Run Code Online (Sandbox Code Playgroud)


And*_*ēza 8

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

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

dplyr::filter(foo)
plyr::filter(bar)
Run Code Online (Sandbox Code Playgroud)

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


Jor*_*eys 8

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

fortunes::fortune()
Run Code Online (Sandbox Code Playgroud)

fortunefortunes包中调用函数。

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

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

由于该问题是由软件包开发人员自己造成的,因此作为用户,除了自己侵入 S3 系统以找到所需的实际方法之外,您几乎无能为力。


wjc*_*lme 5

尽管答案是正确的,但不适用于in运算符,如magrittr%>%%$%。该import软件包可以治疗:

import::from(magrittr, "%$%")
Run Code Online (Sandbox Code Playgroud)

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

import::from(foo, "do_stuff", "do_other_stuff")
Run Code Online (Sandbox Code Playgroud)

请注意,“ [ import]不适用于library。它的名称使之具有import::from(pkg, fun1, fun2)表现力。” 有关更多详细信息,请参见https://CRAN.R-project.org/package=import

  • 也可以简单地执行 `\`%>%\` = magrittr::\`%>%\`` (6认同)