【问题标题】:Comparing development versions of an R package比较 R 包的开发版本
【发布时间】:2014-10-14 03:06:39
【问题描述】:

短版:我正在开发一个 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 环境中同时运行 foobar 的两个版本。

如果我只有一个函数,我可能会做类似somePackage::barsomePackage_dev::bar 的事情,但实际上我在somePackage 中有几十个函数,进行这些更改会很乏味,应该是不必要的。

这里的关键是需要在同一环境中运行foo 的两个版本,以便我可以快速轻松地比较两个版本在相同输入上的时序和输出。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以通过将包命名空间加载到环境中,然后附加和分离它们来实现此目的。您可以查看my answer here 了解有关此策略的更多信息。但基本上,你可以照你说的做,然后为两个版本加载命名空间,如下所示:

    x <- loadNamespace('somePackage')
    y <- loadNamespace('somePackage_dev')
    

    这会将包名称空间加载到环境xy 中,而不会将它们附加到搜索路径。然后你可以只用attachdetach 来决定你想在全局环境中使用哪个版本的包。

    这是一个简单的例子,说明它是如何工作的(想象一下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
    

    【讨论】: