在R中开发包时清除以前版本的函数
我正在用R开发一个包。我们把它叫做在R中开发包时清除以前版本的函数,r,package,R,Package,我正在用R开发一个包。我们把它叫做mypkg 因为有些函数在从包运行时表现不同(我不确定为什么——但这不是问题所在),所以我在包中编辑函数,然后从命令行重建包。出于某种原因,即使源代码已更改,包已重建并重新安装,给定的R实例仍保留较旧版本的函数。我需要启动一个新实例来查看更改 下面是典型的工作流程 在mypkg.R 在R:detach中(包:mypkg);删除.packages(“mypkg”) 命令行:R CMD INSTALL--build c:\mypkg 通知我它已安装到默认库 在R:l
mypkg
因为有些函数在从包运行时表现不同(我不确定为什么——但这不是问题所在),所以我在包中编辑函数,然后从命令行重建包。出于某种原因,即使源代码已更改,包已重建并重新安装,给定的R实例仍保留较旧版本的函数。我需要启动一个新实例来查看更改
下面是典型的工作流程
mypkg.R
detach中(包:mypkg);删除.packages(“mypkg”)
R CMD INSTALL--build c:\mypkg
library(mypkg)
myfunction()
在更改之前运行以前的版本library(mypkg)
myfunction()
按预期工作我正在寻找如何改进此工作流以避免启动新的R实例的建议。您需要尝试卸载包并将其分离<代码>?分离具有: 如果包有名称空间,默认情况下不会分离它 卸载命名空间(甚至可能不使用“unload=TRUE”),并且 拆离通常不会卸载任何动态加载的 编译代码(DLL)。此外,从 命名空间将不会被删除。如果在包上使用“库” 其命名空间已加载,它会附加已加载的 加载的命名空间。因此,分离和重新连接包裹可能不会 刷新包的部分或所有组件,这是不可取的 特别注意最后一句话 尝试: 注意,“如果一个包有一个名称空间”现在指的是所有的包,因为这在R2.14.0(IIRC版本号)中被更改了
如果您正在更改的代码是R代码,请考虑使用<代码>赋值NAMESPACE()/Cyto>在您的全局工作空间中分配一个对象/函数(即,在代码< MyPKK< /COD>中的新版本的函数)到<代码> MyPKG的命名空间。例如,我们在
mypkg
中有函数foo()
,在本地我们有newfoo()
,它是foo()
的较新版本:
如果更改与C代码相关,或者上述操作不起作用,那么也许您应该遵循R Core的建议,生成一个新的R实例,而不是尝试分离包
另请参见Hadley Wickham和Emacs+ESS的devtools包,如果您使用Emacs,则可能会使开发过程更容易(生成新的R实例等)。detach(包:mypkg,unload=TRUE)
当然,工作非常好。我一直在回避学习这些新事物。看来我再也无法避免了。
detach(package:mypkg, unload = TRUE)
assignInNamespace("foo", newfoo, "mypkg")