简短版本:我正在开发一个R包,目前我有一个稳定的版本。我有一些更新,并希望将更新版本的代码与同一R环境中的稳定版本进行比较。我该怎么做呢?
我是打包开发的新手,我怀疑dev_mode在这里很有帮助,但是?dev_mode没有帮助我。
长版:以下是我遇到的主要问题...在软件包内部(让我们称之为somePackage
)我有一个函数
foo <- function(x){
y <- bar(x) # some other function defined inside my package
y
}
如果我只是在一个单独的目录中复制somePackage
来制作开发版本,那么加载两者,R现在看到bar
的两个副本,这会产生冲突。我无法在同一个R环境中运行foo
和bar
两个版本。
如果我只有一个函数,我可能会做somePackage::bar
和somePackage_dev::bar
之类的事情,但实际上我在somePackage
中有几十个函数并且进行这些修改会很乏味并且应该是不必要的。
这里的关键是需要在同一环境中运行foo
的两个版本,以便我可以快速轻松地比较两个版本在相同输入上的时间和输出。
答案 0 :(得分:4)
您可以通过将包名称空间加载到环境中然后附加和分离它们来实现此目的。您可以查看my answer here了解有关此策略的更多信息。但基本上,你可以像你说的那样做,然后为这两个版本加载命名空间,如:
x <- loadNamespace('somePackage')
y <- loadNamespace('somePackage_dev')
这会将包名称空间加载到环境x
和y
中,而不会将它们附加到搜索路径。然后,您可以attach
和detach
来决定要在全局环境中使用哪个版本的软件包。
以下是一个关于如何工作的简单示例(只是想象a
是一个函数,而不是一个常量):
> x <- new.env()
> y <- new.env()
> search()
[1] ".GlobalEnv" "package:stats" "package:graphics"
[4] "package:grDevices" "package:utils" "package:datasets"
[7] "package:devtools" "package:methods" "Autoloads"
[10] "package:base"
> x$a <- 1
> y$a <- 2
> a
Error: object 'a' not found
> x$a
[1] 1
> y$a
[1] 2
> attach(x)
> search()
[1] ".GlobalEnv" "x" "package:stats"
[4] "package:graphics" "package:grDevices" "package:utils"
[7] "package:datasets" "package:devtools" "package:methods"
[10] "Autoloads" "package:base"
> a
[1] 1
> detach(x)
> a
Error: object 'a' not found
> attach(y)
> search()
[1] ".GlobalEnv" "y" "package:stats"
[4] "package:graphics" "package:grDevices" "package:utils"
[7] "package:datasets" "package:devtools" "package:methods"
[10] "Autoloads" "package:base"
> a
[1] 2
> detach(y)
> a
Error: object 'a' not found