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.call
、 sys.function
和 sys.frame
以及适当的索引返回。
sys.call
、 sys.function
和 sys.frame
接受参数 which
的整数值。 which
的非负值是从 .GlobalEnv
开始的帧编号,而负值是从当前评估的帧编号开始倒数。
函数求值的父框架是调用该函数的环境。它的编号不一定比当前评估的帧号小一,也不是定义函数的环境。如果 n
为 1(默认),sys.parent
返回父框架的编号;如果 n
为 2,则返回祖父框架的编号,依此类推。另请参阅“注释”。
sys.nframe
返回一个整数,即当前帧的编号,如第一段中所述。
sys.calls
和 sys.frames
分别给出所有活动调用和帧的对列表,sys.parents
返回每个帧的父帧索引的整数向量。
请注意,即使 sys.
xxx 函数(sys.status
除外)被解释,它们的上下文也不会被计算或报告。无法访问它们。
sys.status()
返回一个包含组件 sys.calls
、 sys.parents
和 sys.frames
的列表,即调用这三个函数的结果(其中包括对 sys.status
的调用:请参阅第一个示例)。
sys.on.exit()
返回当前正在计算的函数中存储供 on.exit
使用的表达式。 (请注意,这与 S 不同,S 返回当前帧及其父帧的表达式列表。)
parent.frame(n)
是 sys.frame(sys.parent(n))
的方便简写(实现效率稍高)。
值
sys.call
返回一个调用,sys.function
返回一个函数定义,sys.frame
和 parent.frame
返回一个环境。
对于其他函数,请参阅“详细信息”部分。
注意
严格来说,sys.parent
和 parent.frame
指的是父解释函数的上下文。因此,内部函数(可能会或可能不会设置上下文,因此可能会或可能不会出现在调用堆栈上)可能不会被计算在内,并且 S3 方法也可以做一些令人惊讶的事情。
由于惰性求值的影响,这些函数在求值时而不是在调用时查看调用堆栈。将调用作为函数参数传递给它们不太可能是一个好主意,但这些函数仍然会查看调用堆栈并从调用它们的函数评估框架中计算框架。
因此,当调用这些函数来为函数参数提供默认值时,它们会在被调用函数的求值中进行求值,并相应地对帧进行计数(例如,参见 eval
的 envir
参数)。
例子
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.frame
和 parent.frame
的用法。
相关用法
- R sys.source 解析和评估文件中的表达式
- R system.file 查找 R 系统文件的名称
- R system.time 使用的 CPU 时间
- R system 调用系统命令
- R system2 调用系统命令
- R strsplit 分割字符向量的元素
- R seq.Date 生成规则的日期序列
- R search 给出 R 对象的搜索路径
- R solve 求解方程组
- R scan 读取数据值
- R sprintf 使用 C 风格字符串格式化命令
- R stop 停止函数执行
- R sign 标志函数
- R svd 矩阵的奇异值分解
- R strtoi 将字符串转换为整数
- R source 从文件、连接或表达式中读取 R 代码
- R sQuote 引用文字
- R switch 选择替代方案列表之一
- R substitute 替换和引用表达式
- R strrep 重复字符向量的元素
- R split 分组并重新集合
- R slice.index 数组中的切片索引
- R sort 对向量进行排序或排序
- R standardGeneric 形式化方法系统 – 调度 S4 方法
- R sequence 创建序列向量
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Functions to Access the Function Call Stack。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。