将 R 函数生成的对象带到主工作环境

Bring the objects produced by a R function to the main working environment

我正在尝试检查 R 函数生成的内部对象,如下例所示:

myfunction <- function(arg1, arg2){
sum.both <- arg1+arg2
diff.both <- arg1-arg2
return(diff.both)
}

我知道我可以通过修改函数本身将它带到工作环境中:

myfunction.mod <- function(arg1, arg2){
sum.both <- arg1+arg2
sum.both <<- sum.both
diff.both <- arg1-arg2
return(diff.both)
}

myfunction.mod(1,2)

通过这样做,我可以通过在控制台中键入 ls() 来查看 sum.both 对象。但是,我正在寻找一种从任何现有函数中获取此类内部对象的方法。因此,我尝试了 debug()environment() 都没有成功。任何有关如何从函数中获取内部对象的想法或指示都将不胜感激。

我想修改现有函数的一种简单方法是使用 trace() 调试工具。我们可以使用它来插入代码,在函数退出时 运行 将函数作用域中的所有值 "leak" 放入全局作用域。下面是这样一个函数

make_leaky <- function(f) {
  fn <- substitute(f)
  invisible(trace(fn, print=FALSE, exit=quote(list2env(mget(ls()), globalenv()))))
}

那我们可以用下面的函数来测试一下

foo <- function(x, y) {
  a <- x+7
  b <- x*y
  b/a
}

我们将使用ls()查看每一步的所有变量

ls()
# [1] "foo"        "make_leaky"
foo(5,2)
# [1] 0.8333333
ls()    # NO NEW VARIABLES CREATED HERE
# [1] "foo"        "make_leaky"   
make_leaky(foo) 
foo(5,2)
# [1] 0.8333333
ls()   # ALL VARIABLES FROM FOO ARE NOW IN GLOBAL ENV
# [1] "a"          "b"          "foo"        "make_leaky"
# [5] "x"          "y"