我运行以下代码
sapply( 0:3, function(x){ls(envir = sys.frame(x))} )
获得以下结果
[[1]]
[1] "mat" "mat_inverse"
[[2]]
[1] "FUN" "simplify" "USE.NAMES" "X"
[[3]]
[1] "FUN" "X"
[[4]]
[1] "x"
它似乎列出了当前封闭环境中的所有对象;我确实将mat和mat_inverse作为两个变量。但我不确定[[2]],[[3]],[[4]]的回报。有没有办法调试此代码来跟踪此代码的作用?特别是以下部分:
envir = sys.frame(x)
对我来说非常困惑。
答案 0 :(得分:3)
sys.frame
允许您返回调用堆栈。 sys.frame(0)
是堆栈的开头(您的初始工作空间,可以这么说)。 sys.frame(1)
嵌套在一层深,sys.frame(2)
嵌套两层深等。
此代码很好地展示了致电sapply
时会发生什么。它通过四个环境(编号为0-3)并在每个环境中打印对象。 sapply
实际上是lapply
的包装器。实际调用此代码时,您会获得哪些环境?
环境0是开始,即整个工作区。
环境1是sapply
。输入sapply
以查看其代码。你会看到函数头有simplify
,你在[[2]]中看到的变量之一。
环境2是lapply
。再次输入lapply
以查看其代码;函数头包含FUN
和X
。
环境3是您为sapply
定义的功能。它只有一个变量x
。
作为实验,运行
sapply(0:3, function(x) { howdy = 5; ls(envir = sys.frame(x)) } )
最后一行将更改为[1] "howdy" "x"
,因为您在最终环境中定义了一个新变量(lapply
内的sapply
内的函数)。