purrr的每一个都不适合is.na

时间:2018-03-07 10:10:40

标签: r purrr

我最近使用了purrr包中的每个命令,我不确定它是否按照预期的方式工作:

 public PrescriptionNotationParser()
  {
    final NumberFormat numberFormat = NumberFormat.getInstance();

    if (numberFormat instanceof DecimalFormat)
    {
      doseValueFormat = (DecimalFormat) numberFormat;
      doseValueFormat.applyPattern("##.########");
      decimalFormatSymbols = doseValueFormat.getDecimalFormatSymbols();
    }
  }

  private double parse(final String valueStr)
  {
   try
    {
      return doseValueFormat.parse(valueStr).doubleValue();
   }
  catch (ParseException e)
  {
    return 0;
   }
}

根据我的理解,每个检查列表中的每个元素是否满足某个条件,在我的例子中,它检查组件是否为NA。 在第一种情况下,它正确地返回false,因为只有第三个组件是NA。 但在第二种情况下,没有元素等于NA,它返回TRUE。这可能是个错误吗?

1 个答案:

答案 0 :(得分:6)

这是因为every期望谓词函数作为第二个参数,即在给定输入的情况下将返回单个逻辑值的函数。

当您将is.na应用于b1:10中的第一个(也是唯一的)元素时,您会得到一个10 FALSE s的向量结果,这是然后通过rlang::is_false测试虚假性。评估结果为FALSE,因为10 FALSE s的向量与单个FALSE不同,后者会导致every返回TRUE。< / p>

如果使用谓词函数,结果与预期一致:

every(b, compose(any, is.na))
#> [1] FALSE

但奇怪的是,当使用谓词函数时,如果需要长度为1的参数,则不会收到带有向量参数的警告。可能值得为此提出一个问题。