當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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