R 非标准评估的危险在哪里(如果有)有记录?

R 非标准评估的危险在哪里(如果有)有记录?,r,with-statement,nse,non-standard-evaluation,R,With Statement,Nse,Non Standard Evaluation,R的许多非标准求值函数,例如带的、子集和转换,包含如下警告: 对于交互式使用,这是非常有效的,很好阅读。然而,对于编程,即在函数中,需要更加小心,通常应避免使用with(),因为数据中的变量可能会意外覆盖局部变量,请参阅参考。 (引用了和的文档,其他文档的信息较少) “参考”是。坦率地说,我看不出它的相关性。它在第6节中提到了“数据中的变量可能会意外地覆盖局部变量”这一点,但它只提到了这一点。就我所见,那篇文章中没有告诉你任何警告告诉你检查参考文献没有告诉你的事情 我已经搜索过了,甚至在3500

R的许多非标准求值函数,例如带的、
子集
转换
,包含如下警告:

对于交互式使用,这是非常有效的,很好阅读。然而,对于编程,即在函数中,需要更加小心,通常应避免使用
with()
,因为数据中的变量可能会意外覆盖局部变量,请参阅参考。
(引用了
的文档,其他文档的信息较少)

“参考”是。坦率地说,我看不出它的相关性。它在第6节中提到了“数据中的变量可能会意外地覆盖局部变量”这一点,但它只提到了这一点。就我所见,那篇文章中没有告诉你任何警告告诉你检查参考文献没有告诉你的事情

我已经搜索过了,甚至在3500页的参考索引中搜索了“非标准”一词,但除了我已经提到的以外,我什么也没找到。我真的以为它会在,但我读了整件事,没有找到它。我得到的最接近的结果是,我碰巧知道很多非标准求值函数都依赖于它

至于其他我确信找不到帮助的地方,我从头到尾都读过。R FAQ多次提到
eval
substitute
,但与此处无关。唯一值得注意的是,它还建议检查文档中的
deriv
,但我发现那里没有什么有用的东西

那么,在R的任何官方部分中,非标准评估的危险都有记录吗?我觉得很奇怪,R的文档的一部分会告诉我要注意一些事情,而没有提供任何地方告诉我如何去做。不可否认,需要小心。例如,具有非标准求值的函数可能会导致问题。对于之前的这种粗心大意,不难发现评论中充满了关于非标准评估的警告。

我想R语言定义的一部分说明了整个问题

另一种经常发生的情况是列表或数据框中的求值。例如,当给定数据参数时,这与model.frame函数有关。通常,需要在数据中计算模型公式的项,但它们有时也可能包含对model.frame调用者中项的引用。这在模拟研究中有时很有用。因此,为此,不仅需要计算列表中的表达式,还需要指定一个附件,如果变量不在列表中,则搜索将继续进行。因此,调用的形式为
eval(expr,data,sys.frame(sys.parent())

然后是文本似乎“警告”读者的特定部分:

请注意,给定环境中的评估实际上可能会改变该环境,最明显的是在涉及赋值运算符的情况下,例如
eval(quote(total)(作为答案发布,因为这对于注释来说有点太长了。)

我不知道有哪个地方记录了这些危险,但根据我个人的经验,在使用NSE时,有两个重要的注意事项需要记住:

  • ,这会导致在尝试使用使用
    substitute()
    的函数执行复杂操作时出现问题。示例包括和

  • 如果使用
    rlang
    ,则运算符
    !!
    会导致错误。如果表达式包含将在计算表达式其他部分时定义的变量,则可能会导致模糊的“未找到变量”错误


  • 除了这两个注意事项之外,我通常认为NSE非常健壮。如果您使用
    rlang
    ,这一点尤其正确,这对标准化NSE功能有很大帮助。因此,我个人的建议是仅在必要时使用NSE,并坚持标准评估(SE)尽可能多。虽然NSE功能非常强大,但它生成的代码可能难以阅读、理解和维护。

    我不相信。你可能是对的,但我非常怀疑。正如你所说,它非常间接地接近这个主题。它主要讨论的是
    eval
    的可选参数,所以我们离它只有三步之遥这里引用的部分并不是指
    with
    ,甚至不是指它所依赖的
    substitute
    函数:它主要是指
    eval
    函数的一个可选参数,在使用
    eval
    时,可以使用
    substitute
    ,而您只需要使用
    eval
    可能会用
    来构建一个像
    这样的函数。这离问题太远了。我同意!我不确定是否有任何官方的东西。我查阅了所有你链接到的文档。真遗憾!只是一个跟进:从我所能找到的来看,答案可能在于R在很大程度上基于的编程语言(特别是S-PLUS版本和白皮书版本),这反过来又深受LISP的启发。可能非标准求值在S文档中有更详细的介绍?但是,我找不到任何合理可读或免费的文档。@eduardokapp R和S没有相同的范围规则。从我在其他地方读到的内容来看,非标准求值的主要问题之一是如何进行找到它调用的参数。大概,如果S有完全不同的范围规则,那么它就不能像对R那样说问题工作了。现在我们已经接近悬赏的终点了,大量的赞成票给我留下了一个强烈的印象,那就是答案是“它们在任何地方都没有记录”。真丢脸。@eduard