【问题标题】:lexical scoping and nested functions in eval(parse())eval(parse()) 中的词法作用域和嵌套函数
【发布时间】:2023-03-18 03:03:01
【问题描述】:

我在使用 drake issue 35 时遇到了问题,我已经为这篇 SO 帖子复制了一个最小版本的错误。简而言之,我希望eval(parse()) 能够使用嵌套函数、非平凡闭包和自定义环境。如果下面的eval(parse(text = "f(1:10)"), envir = e) 返回2:11 且没有错误或警告,我会认为问题已解决。

e = new.env(parent = globalenv())
e$f = Vectorize(function(x) g(x), "x")
e$g = function(x) x + 1
eval(parse(text = "f(1:10)"), envir = e)

(函数(x)中的错误:找不到函数“g”

environment(e$f) = environment(e$g) = e
eval(parse(text = "f(1:10)"), envir = e)

匹配错误(x, table, nomatch = 0L): 找不到对象“vectorize.args”

编辑

在现实世界中,fg 是用户定义的,所以我应该保持这些函数的主体不变。

【问题讨论】:

    标签: r closures eval lexical-scope


    【解决方案1】:

    使用attach附加e环境的对象并调用函数f

    e = new.env(parent = globalenv())
    e$f = Vectorize(function(x) g(x), "x")
    e$g = function(x) x + 1
    attach(e)
    search()
    eval(parse(text='f(1:10)'))
    # [1]  2  3  4  5  6  7  8  9 10 11
    detach(e)
    search()
    

    【讨论】:

    • 我真希望我能做到这一点,但在现实世界中,fg 是用户定义的。这是drake 试图完成的工作中不可避免的一部分。
    • 没关系,我没有完全列出问题的约束条件。对 OP 的编辑应该会有所帮助。
    • 我只提drake,否则人们会批评使用eval(parse())的前提。
    • 这看起来更有希望,但我仍然收到Error in g(x) : could not find function "g"。我在 Red Hat Linux 4.4.7-16 上尝试了您的想法 R 3.3.3 和 3.4.0,在 Windows 7 上尝试了 R 3.3.3。
    • 这很奇怪。我每次都从一个新的工作空间开始。甚至没有自动加载的.RData 文件。
    【解决方案2】:

    为了后代,我只想为不依赖attach()的同一想法添加另一种方法。

    e = new.env(parent = globalenv())
    eval(parse(text='f <- Vectorize(function(x) g(x), "x")'), envir = e)
    eval(parse(text='g <- function(x) x + 1'), envir = e)
    e2 = list2env(as.list(e), parent = e)
    eval(parse(text = "f(1:10)"), envir = e2)
    

    [1] 2 3 4 5 6 7 8 9 10 11

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2014-07-11
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      相关资源
      最近更新 更多