4

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

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

这是典型的工作流程。

  1. myfunction()对in 进行更改mypkg.R
  2. 在 R 中: detach(package:mypkg); remove.packages("mypkg")
  3. 命令行:R CMD INSTALL --build c:\mypkg
  4. 通知我它已安装到默认库
  5. 在 R 中:library(mypkg)
  6. 在 R 中:myfunction()运行更改前的先前版本。

[接下来我要避免的三个步骤]

  1. 启动一个新的 R 实例
  2. 在 R 中:library(mypkg)
  3. myfunction()按预期工作

在 R.2.14.1 下运行。

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

4

1 回答 1

4

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

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

特别注意最后一句话。

尝试:

detach(package:mypkg, unload = TRUE)

请注意,“如果包有命名空间”现在表示所有包,因为这在 R 2.14.0 中已更改(IIRC 版本号)

如果您要更改的代码是 R 代码,请考虑使用assignInNamespace()将全局工作区中的对象/函数(即 中的较新版本的函数mypkg)分配给mypkg. 例如,我们foo()mypkg本地和本地都有函数,newfoo()这是较新版本的foo()

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

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

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

于 2012-04-30T15:16:49.527 回答