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

在R中开发包时清除以前版本的函数,r,package,R,Package,我正在用R开发一个包。我们把它叫做mypkg 因为有些函数在从包运行时表现不同(我不确定为什么——但这不是问题所在),所以我在包中编辑函数,然后从命令行重建包。出于某种原因,即使源代码已更改,包已重建并重新安装,给定的R实例仍保留较旧版本的函数。我需要启动一个新实例来查看更改 下面是典型的工作流程 在mypkg.R 在R:detach中(包:mypkg);删除.packages(“mypkg”) 命令行:R CMD INSTALL--build c:\mypkg 通知我它已安装到默认库 在R:l

我正在用R开发一个包。我们把它叫做
mypkg

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

下面是典型的工作流程

  • mypkg.R
  • 在R:
    detach中(包:mypkg);删除.packages(“mypkg”)
  • 命令行:
    R CMD INSTALL--build c:\mypkg
  • 通知我它已安装到默认库
  • 在R:
    library(mypkg)
  • 在R中:
    myfunction()
    在更改之前运行以前的版本
  • [我希望避免的下三个步骤]

  • 启动一个新的R实例
  • 在R:
    library(mypkg)
  • myfunction()
    按预期工作
  • 按R.2.14.1运行


    我正在寻找如何改进此工作流以避免启动新的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")