如何在R控制台中对内部函数进行源代码测试
是否可以从R控制台获取和使用内部函数 例如,我在名为如何在R控制台中对内部函数进行源代码测试,r,console,scope,R,Console,Scope,是否可以从R控制台获取和使用内部函数 例如,我在名为script.R outer_fun = function() { inner_fun = function() { print('inner_fun') } print('outer_fun') } 寻源script.R将外部乐趣添加到全局环境中,而不是内部乐趣。但是我需要访问internal\u fun来测试它。因此,我必须在任何函数的作用域之外定义internal\u fun。但是代码的组织变得混
script.R
outer_fun = function() {
inner_fun = function() {
print('inner_fun')
}
print('outer_fun')
}
寻源
script.R
将外部乐趣
添加到全局环境中,而不是内部乐趣
。但是我需要访问internal\u fun
来测试它。因此,我必须在任何函数的作用域之外定义internal\u fun
。但是代码的组织变得混乱,这使得维护变得困难。我认为向全局环境添加内部乐趣的唯一可能方法是通过
eval(body(outer_fun))
inner_fun() # is available now
如果outer\u fun
需要运行一些参数,可以将它们添加到全局环境中
但我不认为如果你正确使用调试模式,你真的需要这样的黑客来“测试”函数。试一试
outer_fun = function() {
browser()
inner_fun = function() {
print('inner_fun')
}
print('outer_fun')
}
然后在控制台上执行以下操作:
> outer_fun()
Called from: outer_fun()
Browse[1]> inner_fun()
[1] "inner_fun"
Browse[1]>
Use可以使用debug
单步执行outer\u-fun
如果internal\u-fun
不是微不足道的,我不会在outer\u-fun
中定义它。然而,这并不意味着包中的代码组织会自动变得混乱。我不明白将内部乐趣
的定义移动到外部外部乐趣
有什么可怕的。你能详细解释一下为什么你认为它“凌乱”吗?@flodel说得对。因此,我将修改我的评论,说“在您的开发环境中保持所有函数的独立性,并且只有在完整的单元测试之后才重新打包。”如果公共访问是主要关注点,那么您可以在函数名前面加一个点.internal\u fun
,以稍微隐藏它。像ls()
这样的函数将无法找到它,除非您指定all=TRUE
eval
肯定会污染他的环境,或以“object unfound”出错<代码>浏览器/调试
是非常交互式的功能,不太适合单元测试。