将 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"
我正在尝试检查 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"