【问题标题】:Resuming stopped evaluation in R with correct search path使用正确的搜索路径在 R 中恢复停止的评估
【发布时间】:2014-06-27 16:28:38
【问题描述】:

我在加载的库中有一个函数,它使用替代函数停止对其参数的评估。然后,该函数在同一个库中调用另一个函数,该函数从该库中调用另一个函数,依此类推,直到之后的几次调用,当我想在提供它的 original 环境中评估该初始参数时.我遇到的问题是加载库中函数的搜索路径在全局环境之前包括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。这似乎更普遍,但并不完美。我必须知道哪些函数会停止评估。

有人有更通用的解决方案吗?

【问题讨论】:

标签: r environment-variables substitution


【解决方案1】:

为这些函数添加默认环境是否有助于解决问题?

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

如果没有,也许您可​​以使用函数调用和预期输出制作一个更清晰、可重现的示例。否则不清楚你在哪里遇到了麻烦。

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 2016-04-16
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2020-11-20
    • 2014-10-03
    相关资源
    最近更新 更多