![](/img/trans.png)
[英]R package building: How to import a function from a package not on CRAN
[英]From [package] import [function] in R
使用 Python 或 R 中的数据,我们经常加载多个包。 在某些情况下,两个包(例如foo
和bar
)可能每个都包含一些 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.