【问题标题】:Why does min/max/sum(c(NA, 4, 5), na.rm = "xyz") work while mean() with same inputs doesn't?为什么 min/max/sum(c(NA, 4, 5), na.rm = "xyz") 工作,而具有相同输入的 mean() 不工作?
【发布时间】:2019-05-21 23:52:11
【问题描述】:

我想了解为什么 R 中的 sum/min/max 函数在将字符串提供给 na.rm 时将其解释为 TRUE,而 mean() 则不会。

我未受过教育的猜测是as.logical("xyz") 返回 NA,它作为参数提供给 na.rm,由于某种奇怪的原因,对于 sum/min/max,它被接受为 TRUE 而不是 mean()

sum(c(NA, 4, 5), na.rm = "xyz") 的预期输出是一个不能解释为逻辑错误的参数(从平均值返回)。我不明白为什么不是这样。

【问题讨论】:

  • min/max/sum 是原语,而 mean 不是,这并非巧合。 if (na.rm) 的处理会在 mean.default 中产生错误,我认为它不会在 min/max/sum 中,因为它们是原语。
  • 这个 QA 非常相似,并且指出了检查 C 源代码的正确方向:stackoverflow.com/a/14035586
  • 我同意,如果na.rm 将被全面评估和强制执行,那将很有用。请注意,na.rm="FALSE" 确实被解析为逻辑,因此并不是任何字符串都变为 TRUE,参见。 sum(c(1:3,NA), na.rm="xyz") == 6、sum(c(1:3,NA), na.rm="TRUE") == 6 和 sum(c(1:3,NA), na.rm="FALSE") == NA。
  • 同意!我不明白这里需要不一致。我对 C 不熟悉,但我认为某种严格的类型检查应该很容易实现,并且会全面强制执行一致的行为。对我来说绝对是WAT!? 时刻。

标签: r conceptual


【解决方案1】:

就mean 而言,它非常简单。正如@Rich Scriven 所说,如果您在控制台中输入mean.default,您会看到一段代码

if (na.rm) 
   x <- x[!is.na(x)]

这会给你错误。

mean(1:10, na.rm = "abc") #gives

if (na.rm) x

类似于做

if ("abc") "Hello"

if ("abc") "Hello" 中的错误:参数不能解释为逻辑


现在关于sum、min、max等用C语言实现的原始函数。这些函数的源代码是here。有一个参数Rboolean narm 传递到函数中。

C 处理布尔值的方式不同。

#include <stdio.h>
#include <stdbool.h>

int main()
{
  bool a = "abc";
  if (a)
    printf("Hello World");
  else
    printf("Not Hello World");
  return 0;
}

如果您运行上述C 代码,它将打印“Hello World”。运行演示here。如果将字符串输入传递给布尔类型,则在C 中将其视为TRUE。事实上,数字也是如此

sum(1:10, na.rm = 12)

也可以。

PS - 我不是 C 方面的专家,但对 R 有一点了解。找到所有这些见解需要花费大量时间。如果我误解了某些内容并提供了任何虚假信息,请告诉我。

【讨论】:

  • 谢谢!我猜字符串和数字在 C 中被认为是真实的,但它仍然让我感到不安,因为它的实现与 R 的规则不一致。我想知道这些原语没有被重构以保持一致性(在 C 中进行某种类型检查)是否有原因。
  • @Puzhu 我同意。如果这些函数无论其底层实现如何都表现出一致的行为,那就更好了。
猜你喜欢
  • 1970-01-01
  • 2017-09-22
  • 2019-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2013-07-01
  • 2017-07-28
  • 1970-01-01
相关资源
最近更新 更多