当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R sys.parent 访问函数调用堆栈的函数


R语言 sys.parent 位于 base 包(package)。

说明

这些函数提供对与调用堆栈上方的函数关联的environment(S 术语中的‘frames’)的访问。

用法

sys.call(which = 0)
sys.frame(which = 0)
sys.nframe()
sys.function(which = 0)
sys.parent(n = 1)

sys.calls()
sys.frames()
sys.parents()
sys.on.exit()
sys.status()
parent.frame(n = 1)

参数

which

如果非负,则返回帧数;如果为负,则返回帧数。

n

要追溯到几代人。 (请参阅“详细信息”部分。)

细节

.GlobalEnv 在帧列表中的编号为 0。每个后续函数评估都会使帧堆栈增加 1。该函数的调用、函数定义和评估环境由 sys.callsys.functionsys.frame 以及适当的索引返回。

sys.callsys.functionsys.frame 接受参数 which 的整数值。 which 的非负值是从 .GlobalEnv 开始的帧编号,而负值是从当前评估的帧编号开始倒数。

函数求值的父框架是调用该函数的环境。它的编号不一定比当前评估的帧号小一,也不是定义函数的环境。如果 n 为 1(默认),sys.parent 返回父框架的编号;如果 n 为 2,则返回祖父框架的编号,依此类推。另请参阅“注释”。

sys.nframe 返回一个整数,即当前帧的编号,如第一段中所述。

sys.callssys.frames 分别给出所有活动调用和帧的对列表,sys.parents 返回每个帧的父帧索引的整数向量。

请注意,即使 sys. xxx 函数(sys.status 除外)被解释,它们的上下文也不会被计算或报告。无法访问它们。

sys.status() 返回一个包含组件 sys.callssys.parentssys.frames 的列表,即调用这三个函数的结果(其中包括对 sys.status 的调用:请参阅第一个示例)。

sys.on.exit() 返回当前正在计算的函数中存储供 on.exit 使用的表达式。 (请注意,这与 S 不同,S 返回当前帧及其父帧的表达式列表。)

parent.frame(n)sys.frame(sys.parent(n)) 的方便简写(实现效率稍高)。

sys.call 返回一个调用,sys.function 返回一个函数定义,sys.frameparent.frame 返回一个环境。

对于其他函数,请参阅“详细信息”部分。

注意

严格来说,sys.parentparent.frame 指的是父解释函数的上下文。因此,内部函数(可能会或可能不会设置上下文,因此可能会或可能不会出现在调用堆栈上)可能不会被计算在内,并且 S3 方法也可以做一些令人惊讶的事情。

由于惰性求值的影响,这些函数在求值时而不是在调用时查看调用堆栈。将调用作为函数参数传递给它们不太可能是一个好主意,但这些函数仍然会查看调用堆栈并从调用它们的函数评估框架中计算框架。

因此,当调用这些函数来为函数参数提供默认值时,它们会在被调用函数的求值中进行求值,并相应地对帧进行计数(例如,参见 evalenvir 参数)。

例子


require(utils)

## Note: the first two examples will give different results
## if run by example().
ff <- function(x) gg(x)
gg <- function(y) sys.status()
str(ff(1))

gg <- function(y) {
    ggg <- function() {
        cat("current frame is", sys.nframe(), "\n")
        cat("parents are", sys.parents(), "\n")
        print(sys.function(0)) # ggg
        print(sys.function(2)) # gg
    }
    if(y > 0) gg(y-1) else ggg()
}
gg(3)

t1 <- function() {
  aa <- "here"
  t2 <- function() {
    ## in frame 2 here
    cat("current frame is", sys.nframe(), "\n")
    str(sys.calls()) ## list with two components t1() and t2()
    cat("parents are frame numbers", sys.parents(), "\n") ## 0 1
    print(ls(envir = sys.frame(-1))) ## [1] "aa" "t2"
    invisible()
  }
  t2()
}
t1()

test.sys.on.exit <- function() {
  on.exit(print(1))
  ex <- sys.on.exit()
  str(ex)
  cat("exiting...\n")
}
test.sys.on.exit()
## gives 'language print(1)', prints 1 on exit

## An example where the parent is not the next frame up the stack
## since method dispatch uses a frame.
as.double.foo <- function(x)
{
    str(sys.calls())
    print(sys.frames())
    print(sys.parents())
    print(sys.frame(-1)); print(parent.frame())
    x
}
t2 <- function(x) as.double(x)
a <- structure(pi, class = "foo")
t2(a)

参考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole. (Not parent.frame.)

也可以看看

eval 用于 sys.frameparent.frame 的用法。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Functions to Access the Function Call Stack。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。