问题描述
查找有关drake
软件包是R用户最近的最佳发现之一。但是,在可重现性方面,我从包装中看到的一个缺点是工作空间混乱,其功能仅仅是辅助功能。
没人知道这些source
d函数是否冲突,或者library
调用的顺序是否重要。我知道有conflicted
软件包,但它只处理软件包。
我知道R中的代码单元应该是一个程序包,但是对少数文件,例如preprocessing.R
,training.R
进行分析并将它们转换为程序包,这似乎很奇怪。无论如何,潜在的名称冲突都是很早就开始的,而且我从未见过有人提出过针对R的简洁方法。
但是有import
软件包,它允许从其他文件中挑选软件包功能和的导入。假设您在a
中具有函数a.R
,然后使用import
导入该函数,则该函数是可访问的,但是其所有依赖项均可用于函数a
,但不是导入,提供有用的隔离。
我使用import
软件包和drake
进行了测试,但是drake
无法检测到导入函数的依存关系是否发生了变化,从而破坏了它的实际用例。有谁知道一种告诉德雷克“深入研究”这些功能的方法,或任何其他方法来使它工作?预先感谢!
解决方法
根据设计,drake
仅跟踪make()
环境中的函数,您可以使用envir
参数进行设置(加上用pkg::fun()
调用的命名空间,但是建立这种能力是一个错误)。默认情况下,envir
只是调用环境(parent.frame()
)。因此,当您使用import::from()
时,请确保将.into
设置为等于""
,以便将东西引入drake
的环境中。
ls()
#> character(0)
import::from(dplyr,mutate,.into = "")
ls()
#> [1] "mutate"
library(drake)
plan <- drake_plan(x = mutate(mtcars,x = 1))
vis_drake_graph(plan)
由reprex package(v0.3.0)于2020-09-05创建
顺便说一句,您刚刚为我们提供了https://github.com/ropensci/drake/issues/1286#issuecomment-649088321中envir = getNamespace("yourPackage")
的替代品,如果您想从多个来源提取函数,则后者是有限的。那谢谢啦!让我们来宣传这种解决方法。