den*_*nis 2 namespaces r package
我有以下问题 - 在这样开始的脚本中:
modules::import("modules")
modules::import("futile.logger")
modules::import("data.table")
modules::import("REDCapR")
Run Code Online (Sandbox Code Playgroud)
作为在其他脚本中使用的模块modules::use,我想使用redcap_write包函数的修改版本REDCapR。
我不知道如何继续。在我看来,有两种可能性:
使用本地存储的修改版本redcap_write。那太好了,因为这将是一个很容易分享的修改。但我不知道如何强制R用redcap_write我本地修改的版本替换包的功能。modules::use只会导入修改后的函数,但不会替换包版本redcap_write
REDCapR安装我在此处创建的软件包的分叉版本https://github.com/dmongin/REDCapR/tree/overwrite。但我不知道如何以简单的方式进行(卸载REDCapR以安装我的分叉版本会有点麻烦:我们在各个开发人员/用户之间共享代码,每个人都应该卸载并重新安装软件包)
您必须修改包命名空间下的内容。redcap_write()下面是用该函数替换的一个示例mean()。
ns <- asNamespace("REDCapR")
fn <- "redcap_write"
unlockBinding(fn, ns)
ns[[fn]] <- mean
lockBinding(fn, ns)
Run Code Online (Sandbox Code Playgroud)
检查它是否有效:
library(REDCapR)
> redcap_write
function (x, ...)
UseMethod("mean")
<bytecode: 0x7f8120229100>
<environment: namespace:base>
> REDCapR::redcap_write
function (x, ...)
UseMethod("mean")
<bytecode: 0x7f8120229100>
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)
编辑:
为了redcap_write在其体内调用正确的函数,您必须在REDCapR环境中设置它。这应该有效(假设newversion是您更正后的redcap_write函数):
ns <- asNamespace("REDCapR")
fn <- "redcap_write"
unlockBinding(fn, ns)
environment(newversion) <- ns
ns[[fn]] <- newversion
lockBinding(fn, ns)
Run Code Online (Sandbox Code Playgroud)