- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是 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 (这看起来确实不是一个好的做法)
所以基本上我有两个问题:
assignInNamespace
到底做什么非常感谢您分享您的经验。
编辑:对这个问题感兴趣的人可能会发现 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/
这个问题已经有答案了: How to do case insensitive string comparison? (23 个回答) 已关闭 3 年前。 用户在我的输入栏中写入“足球”,然后执行第 6
啊,不习惯 javascript 中的字符串。 character_id= + id + correct= + correctOrIncorrect 这就是我需要制作成字符串的内容。如果您无法猜测字符
$(function() { var base_price = 0; CalculatePrice(); $(".math1").on('change', function(e) { Calc
我找不到任何文章回答问题:将Spinnaker部署到Spinnaker将管理的同一Kubernetes集群是否安全/正确?我主要是指生产,HA部署。 最佳答案 我认为Spinnaker和Kuberne
我正在使用MSVC在Windows上从源代码(官方源代码发布,而不是从仓库中)构建Qt5(Qt 5.15.0)。 我正在设置环境。变量,依赖项等,然后运行具有1600万个选项的configure,最后
我需要打印一个包含重复单词的数组。我的数组已经可以工作,但我不知道如何正确计算单词数。我已经知道,当我的索引计数器 (i) 为 49 时,并且当 (i) 想要计数到 50 时,我会收到错误,但我不知道
我正在遵循一个指南,该指南允许 Google map 屏幕根据屏幕尺寸禁用滚动。我唯一挣扎的部分是编写一个代码,当我手动调整屏幕大小时动态更改 True/False 值。 这是我按照说明操作的网站,但
我有一个类“FileButton”。它的目的是将文件链接到 JButton,FileButton 继承自 JButton。子类继承自此以使用链接到按钮的文件做有用的事情。 JingleCardButt
我的 friend 数组只返回一个数字而不是所有数字。 ($myfriends = 3) 应该是…… ($myfriends = 3 5 7 8 9 12). 如果我让它进入 while 循环……整个
这个问题在这里已经有了答案: Is there a workaround to make CSS classes with names that start with numbers valid?
我正在制作一个 JavaScript 函数,当调整窗口大小时,它会自动将 div 的大小调整为与窗口相同的宽度/高度。 该功能非常基本,但我注意到在调整窗口大小时出现明显的“绘制”滞后。在 JS fi
此问题的基本视觉效果可在 http://sevenx.de/demo/bootstrap-carousel/inc.carousel/tabbed-slider.html 获得。 - 如果你想看一看。
我明白,如果我想从函数返回一个字符串文字或一个数组,我应该将其声明为静态的,这样当被调用的函数被返回时,内容就不会“消亡”。 但我的问题是,当我在函数内部使用 malloc 分配内存时会怎样? 在下面
在 mySQL 数据库中存储 true/false/1/0 值最合适(读取数据消耗最少)的数据字段是什么? 我以前使用过一个字符长的 tinyint,但我不确定它是否是最佳解决方案? 谢谢! 最佳答案
我想一次读取并处理CSV文件第一行中的条目(例如打印)。我假设使用Unix风格的\n换行符,没有条目长度超过255个字符,并且(现在)在EOF之前有一个换行符。这意味着它是fgets()后跟strto
所以,我们都知道 -1 > 2u == true 的 C/C++ 有符号/无符号比较规则,并且我有一种情况,我想有效地实现“正确”比较。 我的问题是,考虑到人们熟悉的尽可能多的架构,哪种方法更有效。显
**摘要:**文章的标题看似自相矛盾。 本文分享自华为云社区《Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序》,作者: Jerry Wang 。 文章的标题看似自相矛盾,然而我在“正
我有一个数据框,看起来像: dataDemo % mutate_each(funs(ifelse(. == '.', REF, as.character(.))), -POS) # POS REF
有人可以帮助我使用 VBScript 重新格式化/正确格式化带分隔符的文本文件吗? 我有一个文本文件 ^分界如下: AGREE^NAME^ADD1^ADD2^ADD3^ADD4^PCODE^BAL^A
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!