覆盖命名空间中不可见的S3方法

时间:2017-04-18 12:59:51

标签: r

首先,我有一个名为DataBaseLayer的软件包,它有一个名为LoadFromTable(data_request)的S3方法。第二个是另一个名为RiskCalculator的包,它确定了几种类型的风险,并通过包DataBaseLayer向数据库发出请求。之前"触发" RiskCalculator(通过其中定义的执行函数)建立与数据库的某个模式的连接,方法LoadFromTable将引用该特定模式。

对于我需要执行的某些测试,我必须根据输入data_request的{​​{1}}中的值来切换架构。因此我真正需要的是在LoadFromTable(data_request)中插入一点支票。作为一个注释,目前只有一个默认方法,即LoadFromTable,因此即使只在该特定方法中插入该检查就足够了。

我的问题是双重的:
1.在调用任何LoadFromTable.default方法之前是否有一种通用的方法来插入一段代码,天真地说:在LoadFromTable之前插入一段代码"称为#34;。
2.如果没有这种方式,我们是否至少可以在调用UseMethod("LoadFromTable", data_request)之前插入一段代码(在我的情况下,现在就足够了)。

作为最后一点,我可以想象你可能会说整个结构应该改变,但我同意,这不是我不是这些包的所有者的选择。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

在加载的软件包中更改代码时,我们强烈反对并且从根本上说这是错误的方法,所以我不会在这里讨论它(但我会提到这是通过assignInNamespace function完成的。)

但您的案例可以更轻松地解决:只需覆盖LoadFromTable包中的RiskCalculator泛型函数,如下所示:

LoadFromTable = function (request) {
    # TODO: perform your check here.
    DataBaseLayer::LoadFromTable(request)
}

现在,如果您加载RiskCalculator包并在附加RiskCalculator::LoadFromTable包后明确地(通过LoadFromTable)或隐式(通过RiskCalculator)调用该函数,那么您的实现将被召唤。

答案 1 :(得分:0)

尝试trace

library(DataBaseLayer)
trace(LoadFromTable, quote(print("Hello")))

图书馆声明非常重要,即使您不以其他方式自行访问该包。