简短版本:我正在开发一个 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
的两个版本,这样我就可以快速轻松地比较两个版本在相同输入下的时间和输出。
最佳答案
您可以通过将包命名空间加载到环境中然后附加和分离它们来实现此目的。可以看到my answer here有关此策略的更多信息。但基本上,您可以按照您说的去做,然后使用类似以下内容为两个版本加载命名空间:
x <- loadNamespace('somePackage')
y <- loadNamespace('somePackage_dev')
这会将包 namespace 加载到环境 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
关于r - 比较 R 包的开发版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25410116/