簡體   English   中英

使用正確的搜索路徑恢復R中停止的評估

[英]Resuming stopped evaluation in R with correct search path

我在已加載的庫中有一個函數,該函數可使用替代函數停止對其參數的求值。 然后,此函數在同一個庫中調用另一個函數,該庫又從該庫中調用另一個函數,依此類推,直到以后要在提供原始參數的原始環境中評估該初始參數時多次調用。 我遇到的問題是,加載的庫中函數的搜索路徑在全局環境之前包含namespace::base 例如,假設foobar都是庫lib中的函數。 因此,定義它們的環境是namespace::lib 考慮以下:

> require(lib)
> foo
function (x) 
{
    x <- substitute(x)
    bar(x)
}
<environment: namespace:lib>
> bar
function (x) 
{
     eval(x)
}
<environment: namespace:lib>
> length = 2
> foo(length)
function (x)  .Primitive("length")

由於bar是已加載庫中的函數,因此它首先搜索namespace::base並找到以上內容。 但是,如果bar由用戶在交互式會話中定義,則它將返回2 我正在尋找一種方法來使這些函數發揮作用,就像我從未停止評估一樣,在這種情況下,無論定義函數的環境如何,都將返回2

我不能簡單地使用mget來評估以.GlobalEnv開頭的length ,因為這樣將無法正常工作:

> baz = function()
+ {
+ length <- 3
+ foo(length)
+ }
> baz()
function (x)  .Primitive("length")

相反,我可以向所有涉及的函數添加一個額外的參數,以跟蹤評估暫停前多少幀。 但是,這很混亂並且不理想。

我還可以在最后一個函數bar內調用sys.function ,並追溯以前的調用,並在停止評估的函數上方的環境中評估參數。 例如,如果在調用foo(length)之后在bar主體內調用sys.function(1) ,則會得到以下信息:

function (x) 
{
    eval(x)
}

這確實與foo相同。 然后,我可以將evalsys.frames一起sys.frames 這似乎比較籠統,但不夠完美。 我將不得不知道哪些函數停止評估。

有誰有更一般的解決方案?

向這些功能添加默認環境是否可以解決該問題?

lib<-new.env()
assign("foo", function(x, env=parent.frame()) {
    x<-substitute(x); 
    bar(x, env)
}, envir=lib)
assign("bar", function(x, env=parent.frame()) {
    eval(x, env)
}, envir=lib)
attach(lib)

length = 2
foo(length)
# [1] 2

baz <- function() {
  length <- 3
  foo(length)
}
baz()
# [1] 3

bar(expression(baz()))
# [1] 3

如果沒有,也許您可​​以通過函數調用和預期的輸出來制作一個更清晰,可重現的示例。 否則不清楚您在哪里遇到麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM