gpt4 book ai didi

r - 非标准评估,高级R书中的困惑

转载 作者:行者123 更新时间:2023-12-04 10:12:54 25 4
gpt4 key购买 nike

所以在 Hadley 的高级 R 书中,有一个使用 substitute 的例子,这里是代码的摘录:

subset2 <- function(x, condition) {
condition_call <- substitute(condition)
r <- eval(condition_call, x, parent.frame())
x[r, ]
}

scramble <- function(x) x[sample(nrow(x)), ]

subscramble <- function(x, condition) {
scramble(subset2(x, condition))
}


subscramble(sample_df, a >= 4)
# Error in eval(expr, envir, enclos) : object 'a' not found
traceback()
#> 5: eval(expr, envir, enclos)
#> 4: eval(condition_call, x, parent.frame()) at #3
#> 3: subset2(x, condition) at #1
#> 2: scramble(subset2(x, condition)) at #2
#> 1: subscramble(sample_df, a >= 4)

Can you see what the problem is? condition_call contains the expression condition. So when we evaluate condition_call it also evaluates condition, which has the value a >= 4. However, this can’t be computed because there’s no object called a in the parent environment. But, if a were set in the global environment, even more confusing things can happen:

书中的上述段落有几处让我感到困惑。

  1. 句子“condition_call contains the expression condition”。符号“condition”在函数 subset2 中用作形式参数,也在 scramble(subset2(x,condition)) 中用作实参数。我猜他指的是这个真实的/调用的参数“条件”,对吗?

  2. 作为 promise ,subscramble 定义中的条件是惰性求值的?为什么调用时不求值:争夺(子集2(x,条件))

换句话说,我如何通过查看代码知道一个 promise 是否被求值?比如我理解正确的话,如果我把代码改成下面这样:

scramble(subset2(x,(condition))) 

现在强制评估条件。这里的规则是什么?

  1. Hadley 说“当我们评估 condition_call 时,它也会评估条件”,“它”是什么?他的意思是“评估”触发了某种试图解决 promise “条件”的内部或二次评估吗?这发生在哪里?即 R 试图使用什么环境来找出“条件”的值是什么?

  2. 所以错误“找不到对象”不是由于下面调用中的“x”或“parent.frame()”,而是其他地方?我完全糊涂了。

    r <- eval(condition_call, x, parent.frame())

最佳答案

我无法发表评论,所以我会将其作为答案发布。一切都将只是对 :

Non standard evaluation from another function in R

本质上,在 sample_df 调用环境中,函数将寻找“条件”而不是“a>=4”。由于找不到它,它会向上移动,然后在调用环境中找到条件; subscramble 执行环境(这是因为 subset2(x, condition) 是在此环境中创建的 promise )它发现 a>=4。

现在它需要找到 a,但我们已经离开了 sample_df 数据环境,因此它在全局环境中搜索它,如果在全局环境中定义了 a,则会导致奇怪的结果。

关于r - 非标准评估,高级R书中的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31479813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com