我正在用R.开发一个包。让我们称之为mypkg
。
因为某些函数在从包中运行时表现不同(我不知道为什么 - 但这不是问题),我正在编辑包中的函数,然后从命令行重建包。由于某种原因,给定的R实例保留了旧版本的函数,即使源已更改并且包重建并重新安装。我需要启动一个新实例来查看更改。
这是典型的工作流程。
myfunction()
mypkg.R
进行更改
detach(package:mypkg); remove.packages("mypkg")
R CMD INSTALL --build c:\mypkg
library(mypkg)
myfunction()
在更改之前运行以前的版本。[我要避免接下来的三个步骤]
library(mypkg)
myfunction()
按预期工作在R.2.14.1下运行。
我正在寻找有关如何改进此工作流以避免启动新R实例的建议。
答案 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实例等)。