gpt4 book ai didi

R:从包中覆盖函数的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 05:29:12 25 4
gpt4 key购买 nike

我使用的是 R 包,其中有 2 个函数 f1 和 f2(其中 f2 调用 f1)
我想覆盖函数f1。

自从 R 2.15 和包中强制使用命名空间以来,如果我只是获取新函数,它确实在全局环境中可用(即,只需在控制台中调用 f1(x) 就会返回新结果)。但是,调用 f2 仍将使用封装函数 f1。 (因为命名空间修改了搜索路径,并将其密封,如 here in the Writing R Extensions 教程所述)
用新的 f1 完全替换 f1 的正确方法是什么? (除了重新构建包之外!)这在多种情况下很有用。例如,如果您尚未开发的软件包中存在错误。或者,如果您不想在软件包仍处于开发阶段时每天重新构建它们。

我了解函数

assignInNamespace("f1",f1,ns="mypackage")

但是,帮助页面 ?assignInNamespace 有点神秘,似乎在不提供更多信息的情况下阻止人们使用它,而且我在官方 CRAN 教程上找不到任何最佳实践建议。调用此函数后:

# Any of these 2 calls return the new function
mypackage::f1
getFromNamespace(x = "f1", envir = as.environment("package:mypackage"))

# while this one still returns the old packaged version
getFunction(name = "f1", where = as.environment("package:mypackage"))

这非常令人不安。搜索路径如何受到影响?

现在我正在做一些丑陋的事情,例如修改 lockEnvironment 函数,以便 library 不会锁定包命名空间,并且我可以稍后锁定它一旦我替换了 f1 (这看起来确实不是一个好的做法)

所以基本上我有两个问题:

  1. 在包命名空间(应该被锁定)的情况下,assignInNamespace 到底做什么
  2. 有哪些良好做法?

非常感谢您分享您的经验。

编辑:对这个问题感兴趣的人可能会发现 this blog post非常有趣。

最佳答案

这里有很多不同的情况。

如果是其他人的包中的错误
那么最好的做法是联系包维护者并说服他们修复它。这样每个人都能得到修复,而不仅仅是你。

如果是开发自己的包时出现错误
然后您需要找到一个可以轻松重建包的工作流程。就像使用 devtools包装和打字build(mypackage) ,或单击按钮(RStudio 中的“构建并重新加载”;Architect 中的“R CMD 构建”)。

如果您只是想要与现有包不同的行为
如果这不是一个错误,或者包维护者不会进行您想要的修复,那么您必须维护自己的 f1 副本。使用assignInNamespace在现有包中覆盖它对于探索来说是可以的,但它有点 hacky,所以它并不适合永久解决方案。

您最好的选择是创建自己的包,其中包含 f1 的副本和f2 。这比听起来要简单,因为您只需定义 f2 <- existingpackage::f2 即可。 .

<小时/>

回复评论:

Second and third cases makes sense if you are alone but they require to build and install the packages which is tricky in the case of my organisation as the packages are deployed on dozens of computer and I need root access to update the packages.

因此,获取现有包源的副本,应用补丁,并将其托管在公司网络、github 或 Bitbucket 上。然后可以通过编程方式安装更新的包

install.packages("//some/network/path/mypackage_0.0-1.tar.gz", repos = NULL)

library(devtools)
install_github("mypackage", "mygithubusername")

由于安装只是一行代码,因此您可以轻松地将其推送到任意多台机器上。您也不需要 root 访问权限 - 只需将包安装到不需要 root 访问权限即可写入的库文件夹中。 (阅读 Startup.libPaths 帮助页面,了解如何定义新库。)您需要对这些计算机进行网络访问,但我无法帮助您。与您的网络管理员或老板或任何可以获得您许可的人联系。

关于R:从包中覆盖函数的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26644680/

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