首先,我有一个名为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)
之前插入一段代码(在我的情况下,现在就足够了)。
作为最后一点,我可以想象你可能会说整个结构应该改变,但我同意,这不是我不是这些包的所有者的选择。
感谢您的帮助。
答案 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")))
图书馆声明非常重要,即使您不以其他方式自行访问该包。