确定一个函数是否具有标准评估

29
有没有编程方式可以判断给定的函数是否具有标准评估,如果不是,哪个组成部分的函数评估 - 解析、匹配、作用域、承诺形成、承诺实现、返回等 - 是非标准的?我知道闭包可能是标准的,原始函数可能是非标准的,但两者都有例外。我的问题是如何确定函数语义在这些方面是否符合标准,而不是函数机制是否符合标准。
我假设这些事情应该可以从帮助页面中仔细阅读并推导出来,如果失败,则从代码中寻找,如果还是失败,则从任何引用的源代码中寻找。但是,如果我能够快速识别给定函数评估中的非标准特性,就可以节省我大量的痛苦。 如果没有办法以编程方式识别函数的所有非标准方面,那么有没有办法测试任何标准方面?

5
你能给出一些现有函数的例子并告诉我们你认为它们应该被分类到哪个类别?为什么这很重要?我怀疑除了一个能够阅读帮助页面并从中推断的AI之外,没有其他方法可以通过代码内省来确定函数的分类,特别是在一个对象导向系统中,其中foo(bar)可以放在任何地方。 - Spacedman
5
由于$函数使用了非标准的解析方式,因此很难找到许多完全不包含NSE的函数。 - IRTFM
1
“我认为这些东西应该可以从仔细阅读帮助页面中推导出来。”“祝你好运”。(https://dev59.com/WFEG5IYBdhLWcg3wYcDg)。我甚至找不到这些可恶的东西在哪里有记录。 - J. Mini
1个回答

1

快速检查非标准评估(NSE)的方法是验证是否使用了某些关键字,例如substituteevaldeparse等。 请参见下面的代码。它查看函数体并计算使用了多少次与NSE相关的关键字。

is_nse <- function(x) {
  nse_criteria <- c("substitute", "deparse", "eval", "parent.frame", "quote")
  code <- as.character(body(x))
  print(x)
  cat("-------------------------------------------------------------------\n")
  nse_count <- sapply(nse_criteria, function(x) sum(grepl(x, code)))
  if(sum(nse_count) > 0) 
    warning("Possible non-standard evaluation")
  nse_count
}

is_nse(as.Date.default)

输出:

function (x, ...) 
{
    if (inherits(x, "Date")) 
        x
    else if (is.null(x)) 
        .Date(numeric())
    else if (is.logical(x) && all(is.na(x))) 
        .Date(as.numeric(x))
    else stop(gettextf("do not know how to convert '%s' to class %s", 
        deparse1(substitute(x)), dQuote("Date")), domain = NA)
}
<bytecode: 0x0000021be90e8f18>
<environment: namespace:base>
-------------------------------------------------------------------
  substitute      deparse         eval parent.frame        quote 
           1            1            0            0            0 
Warning message:
In is_nse(as.Date.default) : Possible non-standard evaluation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接