gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:18:57 26 4
gpt4 key购买 nike

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

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

这是典型的工作流程。

  • 更改 myfunction()mypkg.R
  • 在 R 中:detach(package:mypkg); remove.packages("mypkg")
  • 命令行:R CMD INSTALL --build c:\mypkg
  • 通知我它已经安装到默认库
  • 在 R 中:library(mypkg)
  • 在 R 中:myfunction()在更改之前运行以前的版本。

  • [我想避免的接下来的三个步骤]
  • 启动一个新的 R 实例
  • 在 R 中:library(mypkg)
  • myfunction()按预期工作

  • 在 R.2.14.1 下运行。

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

    最佳答案

    您需要尝试卸载包裹以及分离它。 ?detach已:

    If a package has a namespace, detaching it does not by default unload the namespace (and may not even with ‘unload=TRUE’), and detaching will not in general unload any dynamically loaded compiled code (DLLs). Further, registered S3 methods from the namespace will not be removed. If you use ‘library’ on a package whose namespace is loaded, it attaches the exports of the already loaded namespace. So detaching and re-attaching a package may not refresh some or all components of the package, and is inadvisable.



    特别注意最后一句话。

    尝试:
    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 实例,而不是尝试分离您的包。

    另见 开发工具 如果你说 Emacs,Hadley Wickham 和 Emacs+ESS 的包可能会使开发过程更容易(产生新的 R 实例等)。

    关于r - 在 R 中开发包时清除以前版本的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10385984/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com