为什么 min/max/sum(c(NA, 4, 5), na.rm = "xyz") 能够工作,而使用相同输入的 mean() 却不能?

9
我想了解为什么在R中的sum/min/max函数中,当将字符输入到na.rm时会被解释为TRUE,而mean()则不会。我的猜测是as.logical("xyz")返回NA,并被作为参数提供给na.rm,对于sum/min/max函数来说,这个奇怪的原因让NA被视为TRUE,但对于mean()函数则不会。 sum(c(NA, 4, 5), na.rm = "xyz")的预期输出应该是一个无法解释为逻辑值的参数错误(由mean函数返回)。我不明白为什么这种情况不会发生。

2
“min/max/sum” 是原语而 “mean” 不是,这并非巧合。在 mean.default 中,if (na.rm) 的处理会产生错误,而我认为这种情况在 min/max/sum 中不会发生,因为它们是原语。 - Rich Scriven
这个QA非常相似,并且指向了检查C源代码的正确方向:https://dev59.com/BWYr5IYBdhLWcg3wAFg0#14035586/ - John Colby
请提供需要翻译的具体内容。 - John Colby
我认为如果在整个过程中一致地评估和强制na.rm将是有用的。请注意,na.rm="FALSE"确实被解析为逻辑值,因此并不是任何字符串都变成了TRUE,比较如下:sum(c(1:3,NA), na.rm="xyz") == 6sum(c(1:3,NA), na.rm="TRUE") == 6,以及sum(c(1:3,NA), na.rm="FALSE") == NA - HenrikB
同意!我不明白这里为什么需要不一致性。虽然我不熟悉C语言,但我认为某种严格的类型检查应该很容易实现,并且可以在整个程序中强制执行一致的行为。对我来说,这绝对是一个WAT!?时刻。 - Plhu
1个回答

2
就“mean”而言,它非常简单。如@Rich Scriven所述,如果在控制台中键入“mean.default”,则会看到一部分代码。
最初的回答:关于“mean”的问题,它很简单。如果您在控制台中输入“mean.default”,您将看到一段代码。
if (na.rm) 
   x <- x[!is.na(x)]

"最初的回答":这会给你一个错误提示。需要注意的是保留html标签。
mean(1:10, na.rm = "abc") #gives

如果(na.rm) x <- x[!is.na(x)]中出现错误: 参数不能被解释为逻辑值

这类似于执行以下操作:

if ("abc") "Hello"

如果 ("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;
}

如果您运行上面的C代码,它将打印“Hello World”。在这里运行演示。如果您将字符串输入传递给布尔类型,则在C中被视为TRUE。实际上,对于数字也是如此。"最初的回答"
sum(1:10, na.rm = 12)

最初的回答
PS - 我不是C语言专家,只会一点R语言。找到所有这些见解花费了很多时间。如果我有误解或提供了任何虚假信息,请告诉我。

同样有效。


1
谢谢!我猜在C语言中,字符串和数字被认为是真值,但仍然让我困扰的是实现与R的规则不一致。我想知道为什么这些基本类型没有被重构以保持一致性(使用某种类型检查在C中)。 - Plhu
1
@Puzhu 我同意。如果这些函数无论其底层实现如何都能表现出一致的行为,那将会更好。 - Ronak Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接