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

2024-04-06

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

由于 R 2.15 和包中命名空间的强制使用,如果我只是获取新函数,它确实可以在全局环境中使用(即,只需在控制台中调用 f1(x) 即可返回新结果)。但是,调用 f2 仍将使用封装函数 f1。 (因为命名空间修改了搜索路径,并将其密封,如所解释的在编写 R 扩展中 http://cran.r-project.org/doc/manuals/r-release/R-exts.html#Package-namespaces教程)
用新的 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. 有哪些好的做法?

非常感谢您在那里分享您的经历。

编辑:对这个问题感兴趣的人可能会发现这篇博文 http://obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/非常有趣。


这里有很多不同的案例。

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

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

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

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


回复评论:

如果您独自一人,第二种和第三种情况是有意义的,但它们需要构建和安装软件包,这对于我的组织来说很棘手,因为软件包部署在数十台计算机上,并且我需要 root 访问权限来更新软件包。

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

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

or

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • R markdown 引文标识符

    R markdown 允许使用 YAML 元数据部分中的参考书目元数据字段指定参考书目文件 例如 title Sample Document output html document bibliography bibliography bi
  • 在多面图中用 N 注释 x 轴

    我正在尝试生成一些按治疗条件和访问次数细分的数字结果的箱线图 每个框中的观察次数都放在图下方 并且也标记了访问次数 这里有一些虚假数据可以用来说明 我举了两个我尝试过但不太有效的例子 library ggplot2 library plyr
  • r - 从我的应用程序下载shinyapps代码

    我正在尝试从shinyapps io 在另一台电脑上下载我的shiny 应用程序代码 我按照这个例子 https support rstudio com hc en us articles 204536588 从 shinyapps io下
  • 自动将变量名称添加到列表的元素[重复]

    这个问题在这里已经有答案了 我有一个模型列表 为了使代码更易于维护 因此可以方便地添加和删除模型 我希望有一个地方来存储它们及其名称 为此 我必须解决以下命名问题 上游 我生成模型的方式比以下方式效率低 如果是这样压缩的 我会assign他
  • r 连接两个列表并对它们的值求和

    我有两个列表 x y gt x carlo monte simulation model quantum 31 31 9 6 6 gt y model system temperature quantum simulation proble
  • 用闪亮的 R 设计 DT 中的展开行按钮

    我正在尝试设计 DT 中可用的展开行按钮的样式 样式可用here https datatables net examples api row details html 我用于创建数据表的代码是 library DT datatable cb
  • 如何使用 grid.arrange 移动图例位置

    我试图在一页中排列 4 个图 将图例放在底部中心 我用它来获取其中一个图的图例 因为它们对于四个图来说是相同的 get legend lt function myggplot tmp lt ggplot gtable ggplot buil
  • 如何缩放(标准化)每列内的 ggplot2 stat_bin2d 值(按 X 轴)

    我有一个 ggplot stat bin2d 热图 library ggplot2 value lt rep 1 5 1000 df lt as data frame value df group lt rep 1 7 len 5000 d
  • dplyr 总结小计

    Excel 中数据透视表的一大优点是它们会自动提供小计 首先 我想知道 dplyr 中是否已经创建了任何可以实现此目的的东西 如果没有 实现它的最简单方法是什么 在下面的示例中 我按气缸和化油器的数量显示了平均排量 对于每组气缸 4 6 8
  • 如何在RcppParallel中调用用户定义的函数?

    受到文章的启发http gallery rcpp org articles parallel distance matrix http gallery rcpp org articles parallel distance matrix 我
  • R 编程中的字符串分割

    目前 下面的脚本将组合的项目代码拆分为特定的项目代码 rule2 lt c MR df 1 lt test grep paste rule2 sep collapse test Name y SpaceName 1 lt function
  • 在R闪亮中,如何在UI端使用在SERVER端计算的值?

    在我的 R闪亮应用程序中 我想调整我的高度d3heatmap 见包装d3热图 https cran r project org web packages d3heatmap index html 作为我的数据框行数的函数 有一个论点heig
  • R 未获取用户库

    我有一个带 R 3 6 0 的 Fedora 30 系统 用户库设置在Renviron就像这个 R LIBS USER R LIBS USER R x86 64 redhat linux gnu library 3 6 事实上 它出现在交互
  • R中一张图中的多个条形图

    我是 R 初学者 我需要创建一个像这样的图表 https i stack imgur com az56z jpg https i stack imgur com az56z jpg 我不知道如何生成整个数据集 基本思想是某个外显子 ID 会
  • R 中的输出,避免写“[1]”

    I use print从 R 中的函数输出 例如 print blah blah blah 这输出 1 blah blah blah 到控制台 我怎样才能避免 1 和引号 Use cat Your string type cat查看帮助页面
  • data.table:从不存在的列到现有列的“get”失败,静默失败

    gt d lt data table x 1 5 gt d x 6 y get i 9 Error in get i 9 object i 9 not found gt d y 1 add a new column y gt d x 6 y
  • R 在读取文件时添加额外的数字

    我一直在尝试读取一个包含日期字段和数字字段的文件 我的数据在 Excel 工作表中 如下所示 Date X 1 25 2008 0 0023456 12 23 2008 0 001987 当我在 R 中使用readxl read xlsx函
  • 使用 sapply 的列表和矩阵

    我有一个也许是基本的问题 我在网上搜索过 我在读取文件时遇到问题 尽管如此 我还是按照 Konrad的建议设法读取了我的文件 我很欣赏这一点 How to get R to read in files from multiple subdi
  • 根据条件计算平均值

    下面是我的数据框 Row ID A B 1 0 0 2 0 0 3 0 0 4 0 1 5 0 1 6 0 1 7 62 75 0 8 100 0 9 100 0 10 100 1 11 100 1 12 100 1 13 100 1 14
  • 使用cowplot包的多重图的中心X轴标签

    我有一个多图图形 由 2x2 配置中的 4 个图组成 我使用 cowplot 包和plot grid函数使用下面的代码排列了绘图 plot grid p1 p2 p3 p4 align vh vjust 1 scale 1 其中 p1 p4

随机推荐

  • 使用dimplejs创建组合条形图/折线图并使用自定义颜色

    我正在尝试使用 dimplejs 创建基于简单数据集 列 国家 index1 index2 index3 的组合条形图 折线图 Index1 将是条形图 index2 向上应动态 根据用户交互添加和删除索引 在顶部显示为折线图 我发现我似乎
  • 如何向 Stripe 客户申请优惠券

    我找不到任何方法将优惠券 折扣应用于重复付款的现有客户 我正在使用stripe宝石 我继续在 Stripe 仪表板上创建了优惠券 我在他们的 API 页面上没有看到如何添加优惠券 我已经尝试过下面的解决方案 但没有成功 cu Stripe
  • read_excel(来自 readxl 包)将 1899-12-30 之前的日期读取为 NA,如何解决此问题?

    我有一个包含 130 场足球比赛的数据集 这些比赛的历史可以追溯到 1893 年 当我从 Excel 导入数据集时 1900 年的日期与 R RStudio 中应有的日期相同 但是 1900 年之前的日期以 NA 形式出现 我该如何解决这个
  • 指向常量字符的指针

    下面的代码指向a中的第一个字符字符数组可在只读存储器中使用 是对的吗 const char ptr String one 现在 当ptr开始指向另一个内存位置 ptr String two 第一个会发生什么字符数组 执行结束时该内存位置是否
  • 是否有跨设备的 CNContact 标识符?

    CNContact 是否有任何 icloud 标识符可以让我在设备上保留并重复使用 这个想法是能够从不同的 iOS 设备再次拉取 CNContact 文档对此没有任何说明 我知道以前的 ABAddressbook 框架也没有这个功能 但我希
  • 如何从 python/scipy/numpy 等中的步骤函数中采样?

    如果我有每个箱的箱边和计数 是否有一种很好的简洁方法可以从这意味着的概率密度函数中进行采样 这是我的意思的一个例子 bin edges 0 2 1 6 3 23 5 counts 5 2 10 概率密度函数是一个阶跃函数 其步长为 0 2
  • 在 iPhone 键盘顶部添加文本框和按钮

    我想在它旁边添加一个文本框和一个按钮 它们将位于窗口的底部 然后 当我触摸文本框 输入内容 时 键盘将出现 整行 带有文本框和按钮 向上滚动 键盘将位于它们的正下方 你能让我知道我该怎么做吗 有示例程序吗 Thanks 马特 加拉格尔 Ma
  • 每个用户“类型”的 PHP 子文件夹

    我有 3 个子文件夹upload文件夹 我的代码如下所示 if isset SESSION u type SESSION u type 3 files scandir path 3 path is set somewhere above 它
  • $scopeProvider <- $scope/ 未知提供者

    我用茉莉花测试我的角度应用程序 http jasmine github io 2 0 http jasmine github io 2 0 并出现下一个错误 未知提供者 scopeProvider testModule controller
  • C#:锚定面板无法正确调整大小

    关于用户控件中面板的自动调整大小 我遇到了一个奇怪的问题 该面板固定在用户控件的所有 4 个侧面 但锚定并不总是按其应有的方式起作用 如果通过调整窗体大小来调整用户控件的大小 则右侧和底部锚点不起作用 但是 如果使用表单中的拆分器调整控件的
  • 尝试在空对象引用上调用虚拟方法“java.lang.Object android.content.Context.getSystemService(java.lang.String)”

    我正在尝试检查我的应用程序是否是第一次启动 如果是 则要求用户输入 然后 检查 Wi Fi 是否已连接 如果连接了 Wi Fi 我将使用用户提供的输入来加载 WebView 但是 该应用程序在启动时崩溃并出现错误 尝试在空对象引用上调用虚拟
  • 显示来自 javascript Chrome 书签的提示

    我想创建一个 chrome 书签 提示用户输入一个值 然后在 cookie 中设置该值 我无法显示提示 有没有办法做到这一点 当前代码 javascript function var days window prompt Number of
  • 在 Woocommerce 中显示特定产品类别的产品

    我的 WordPress 网站中有这段代码 它显示了我拥有的产品 ul li h3 a href a h3 li ul
  • ValidateRequest=“false” 和 .NET 4 问题

    NET 4 崩溃了ValidateRequest false 因为某些原因 解决方案是 只需将
  • 训练新的 AutoTokenizer 拥抱脸部

    收到此错误 AttributeError GPT2Tokenizer 对象没有 属性 train new from iterator 与拥抱面部文档非常相似 我更改了输入 就是这样 不应该影响它 有一次就成功了 2小时后回来查看 发现并没有
  • 命令按钮在第二次按下时调用操作 (jsf)

    我的应用程序出现了奇怪的行为 命令按钮在第二次点击时开始调用操作 首先 什么也没有发生 它对火狐和铬有效 但在顿悟中照常工作 我的环境 Ubuntu 11 04 玻璃鱼 3 1 1 jsf 2 X 素面 3 2 火狐 12 0 顿悟2 30
  • 在气隙环境中使用 docker 的最佳实践

    我是 Docker 新手 想在气隙环境中使用它 我知道我可以在隔离系统中设置自己的存储库 但我不知道如何从 docker hub 获取所需的许多 docker 镜像到环境中 如果我可以将它们下载到 zip 或 tgz 存档中 那就太好了 但
  • 为什么需要 gwt-bootstrap?

    我是 GWT 新手 正在考虑使用 Twitter Bootstrap 作为 CSS 框架 但后来我遇到了gwt 引导程序 http gwtbootstrap github io 它标榜自己是在 GWT 应用程序中使用 Bootstrap 的
  • 如何在 Spring 中注入 List 实例?

    什么有效 假设我有一个 ArrayList 的 spring bean 定义
  • R:从包中覆盖函数的正确方法是什么?

    我使用的是 R 包 其中有 2 个函数 f1 和 f2 其中 f2 调用 f1 我想覆盖函数f1 由于 R 2 15 和包中命名空间的强制使用 如果我只是获取新函数 它确实可以在全局环境中使用 即 只需在控制台中调用 f1 x 即可返回新结