【问题标题】:Determining whether a function has standard evaluation确定函数是否具有标准评估
【发布时间】:2018-07-28 01:45:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能举一些现有函数的例子,并告诉我们你认为它们应该如何分类吗?为什么这很重要?我怀疑缺少可以读取帮助页面并从代码自省中确定是否有任何方法可以做到这一点的 AI,尤其是在 OO 系统中 foo(bar) 几乎可以去任何地方。
  • 由于$函数使用非标准的eval,很难找到很多完全没有NSE的函数。
  • 我认为这些内容应该是通过仔细阅读帮助页面得出的”。 Good luck with that。我什至找不到被诅咒的东西记录在哪里。

标签: r r metaprogramming non-standard-evaluation


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多