2017-04-18 31 views
0

首先,我有一个名为DataBaseLayer的程序包,它有一个名为LoadFromTable(data_request)的S3方法。其次是另一个包RiskCalculator,它确定了几种类型的风险,并通过包DataBaseLayer来请求数据库。在“触发”RiskCalculator(通过其中定义的执行功能)之前,建立到数据库某个模式的连接并且方法LoadFromTable将引用该特定模式。在命名空间中覆盖不可见的S3方法

对于一些我需要执行的测试,我必须根据data_request中的值进入LoadFromTable(data_request)来切换模式。因此,我真正需要的是在LoadFromTable中插入一点点检查。值得注意的是,目前只有一种默认的方法实现了,即LoadFromTable.default,因此即使只在该特定方法中插入该检查也足够了。

我的问题是这样两个方面:
1.是否有插入之前的任何LoadFromTable方法的一段代码的一般方法被调用时,天真地说:刚UseMethod("LoadFromTable", data_request)被“叫”前插入一段代码。
2.如果没有这种方式,我们至少能够在调用LoadFromTable.default之前插入一段代码(因为在我的情况下,现在就足够了)。

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

感谢您的帮助。

+0

Data_request是传递给RiskCalculator中的某个函数,并传递给DataBaseLayer中的LoadDataFrame还是RiskCalculator制造data_request? –

+0

更具体的一点是:RiskCalculator调用GetRisks()函数,该函数位于一个名为Common的包中,该函数创建data_request并在DataBaseLayer中调用LoadFromTable(data_request) '。此外,RiskCalculator导入Common和Common导入DataBaseLayer。 –

+0

您确实可以建议重写'GetRisks()',然后这将解决一个非常具体的问题,因为'LoadFromTable'以各种方式被调用,而不仅仅是'GetRisks()'。 –

回答

0

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

不过你的情况是可以解决的要容易得多:只是覆盖LoadFromTable泛型函数在RiskCalculator包如下:

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

现在,如果你加载你RiskCalculator封装和调用函数明确地(通过RiskCalculator::LoadFromTable)或者隐式地(通过LoadFromTable附加RiskCalculator包后),您的实现将被调用。

+0

通过重写'RiskCalculator'中的'LoadFromTable',你到底意味着什么?因为如果我尝试在名称空间或包环境中解锁绑定的'LoadFromTable',则会出现'LoadFromTable“的无绑定错误...我可能不完全理解泛型函数背后的想法。 –

+0

@NMeibergen只需将上面的函数添加到您自己的包/代码中即可。 –

+0

考虑到层次结构是这样的:RiskCalculator依赖于DataBaseLayer(通过名称空间中的导入语句),因此它会首先查找“LoadFromTable”,并首先在DataBaseLayer中遇到它,然后到达.GlobalEnv,我的代码位于。我错过了什么吗? –

0

尝试trace

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

图书馆说法是很重要的,即使你不以其他方式自行访问该程序包。

相关问题