如何在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。但是代码的组织变得混

是否可以从R控制台获取和使用内部函数

例如,我在名为
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”出错<代码>浏览器/调试
是非常交互式的功能,不太适合单元测试。