在R中开发包时清除以前版本的函数

时间:2012-04-30 15:10:50

标签: r package

我正在用R.开发一个包。让我们称之为mypkg

因为某些函数在从包中运行时表现不同(我不知道为什么 - 但这不是问题),我正在编辑包中的函数,然后从命令行重建包。由于某种原因,给定的R实例保留了旧版本的函数,即使源已更改并且包重建并重新安装。我需要启动一个新实例来查看更改。

这是典型的工作流程。

  1. myfunction()
  2. 中的mypkg.R进行更改
  3. 在R:detach(package:mypkg); remove.packages("mypkg")
  4. 命令行:R CMD INSTALL --build c:\mypkg
  5. 通知我它已安装到默认库
  6. 在R:library(mypkg)
  7. 在R中:myfunction()在更改之前运行以前的版本。
  8. [我要避免接下来的三个步骤]

    1. 启动新的R实例
    2. 在R:library(mypkg)
    3. myfunction()按预期工作
    4. 在R.2.14.1下运行。

      我正在寻找有关如何改进此工作流以避免启动新R实例的建议。

1 个答案:

答案 0 :(得分:4)

您需要尝试卸载程序包并将其分离。 ?detach有:

  

如果包具有命名空间,则默认情况下不会删除它   卸载命名空间(甚至可能没有'unload = TRUE'),和   分离通常不会卸载任何动态加载   编译代码(DLL)。此外,从注册的S3方法   命名空间不会被删除。如果您在包装上使用“库”   其名称空间被加载,它附加已经的导出   加载命名空间因此,分离和重新附加包装可能不会   刷新包的部分或全部组件,是不可取的。

特别注意最后一句。

尝试:

detach(package:mypkg, unload = TRUE)

请注意,“如果包具有命名空间”现在意味着所有包都在R 2.14.0中更改(IIRC版本号)

如果您要更改的代码是R代码,请考虑使用assignInNamespace()将全局工作空间中的对象/函数(即mypkg中的较新版本的函数)分配给{mypkg的命名空间1}}。例如,我们在foo()中有mypkg函数,在本地我们有newfoo() foo()的较新版本:

assignInNamespace("foo", newfoo, "mypkg")

如果更改与C代码有关,或者上述内容不起作用,那么您可能应该遵循R Core的建议并生成新的R实例,而不是尝试分离您的包。

另请参阅Hadley Wickham的 devtools 包,如果您说Emacs,Emacs + ESS可能会使开发过程更容易(产生新的R实例等)。