我运行以下代码
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)让我很困惑。
发布于 2013-10-03 21:14:15
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中的函数)。
https://stackoverflow.com/questions/19168607
复制相似问题