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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。