29

有没有办法以编程方式判断中的给定函数是否具有标准评估,如果没有,函数评估的哪个组件 -

  • 解析,
  • 匹配,
  • 范围界定,
  • 承诺形成,
  • 承诺兑现,
  • 返回,

等等——是非标准的吗?我知道闭包可能是标准的,而原语可能是非标准的,但两种方式都有例外。我问的是确定函数语义对于这些事物中的每一个是否是标准的,而不是函数机制是否是标准的。

我认为这些东西应该是通过仔细仔细阅读帮助页面、失败的代码和失败的任何引用的源代码得出的。但是,如果我有一种机械的方式来快速识别给定功能的评估中的非标准特征,那将会为我省去很多麻烦。

如果没有办法以编程方式识别函数非标准的所有方式,是否有方法测试标准的 任何 方面?

4

1 回答 1

1

检查非标准评估 (NSE) 的快速方法是验证是否使用了某些关键字,例如substitute,evaldeparse。请参阅下面的代码。它查看函数体并计算使用 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
于 2021-12-07T13:12:08.867 回答