为什么min / max / sum(c(NA,4,5),na.rm =“ xyz”)起作用,而具有相同输入的mean()却不起作用?

Puz*_*zhu 8 r conceptual

我想了解为什么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")不能解释为逻辑错误(从均值返回)。我不明白为什么不是这种情况。

Ron*_*hah 2

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

if (na.rm) 
   x <- x[!is.na(x)]
Run Code Online (Sandbox Code Playgroud)

这给了你错误。

mean(1:10, na.rm = "abc") #gives
Run Code Online (Sandbox Code Playgroud)

if (na.rm) x <- x[!is.na(x)] 中的错误:参数无法解释为逻辑

这类似于做

if ("abc") "Hello"
Run Code Online (Sandbox Code Playgroud)

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


现在介绍summinmax和其他用 C 实现的原始函数。这些函数的源代码在这里。有一个参数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;
}
Run Code Online (Sandbox Code Playgroud)

如果运行上面的C代码,它将打印“Hello World”。在这里运行演示。如果将字符串输入传递给布尔类型,则它被视为TRUEin C。事实上,对于数字来说也是如此

sum(1:10, na.rm = 12)
Run Code Online (Sandbox Code Playgroud)

也有效。

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