ls()函数对R中的环境有什么作用

时间:2013-10-03 20:24:00

标签: r debugging

我运行以下代码

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)

对我来说非常困惑。

1 个答案:

答案 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以查看其代码;函数头包含FUNX。 环境3是您为sapply定义的功能。它只有一个变量x

作为实验,运行

sapply(0:3, function(x) { howdy = 5; ls(envir = sys.frame(x)) } )

最后一行将更改为[1] "howdy" "x",因为您在最终环境中定义了一个新变量(lapply内的sapply内的函数)。