Why does min/max/sum(c(NA, 4, 5), na.rm = “xyz”) work while mean() with same inputs doesn't?
我想了解为什么R中的sum / min / max函数提供给na.rm时会将字符串解释为TRUE,而mean()却不。
我没有根据的猜测是as.logical("xyz")返回NA,NA作为参数提供给na.rm,出于某些奇怪的原因,sum / min / max被接受为TRUE,而mean()则不接受
sum(c(NA, 4, 5), na.rm ="xyz")的预期输出是一个参数,不能解释为逻辑错误(从均值返回)。 我不明白为什么不是这种情况。
-
minmaxsum是原语而mean不是原语不是巧合。 if (na.rm)的处理在mean.default中产生错误,并且我认为由于它们是原语而在minmaxsum中没有错误。
-
此QA非常相似,它指向检查C源代码的正确方向:stackoverflow.com/a/14035586
-
例如 github.com/wch/r-source/blob/
-
我同意,如果全面评估和强制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 !? 我的时刻。
就mean而言,它非常简单。 正如@Rich Scriven提到的,如果您在控制台中键入mean.default,您会看到一段代码
1 2
| if (na.rm)
x <- x[!is.na(x)] |
这给你的错误。
1
| mean(1:10, na.rm ="abc") #gives |
Error in if (na.rm) x <- x[!is.na(x)] :
argument is not interpretable as logical
这类似于做
Error in if ("abc")"Hello" : argument is not interpretable as logical
现在,关于sum,min,max和其他用C实现的原始函数。这些函数的源代码在这里。 函数中传递了参数Rboolean narm。
C处理布尔值的方式不同。
1 2 3 4 5 6 7 8 9 10 11 12
| #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。 实际上,数字也是如此
也可以。
PS-我不是C语言方面的专家,并且对R有点了解。找到所有这些见解需要花费很多时间。 让我知道我是否误解了某些内容并提供了任何虚假信息。
-
谢谢! 我猜字符串和数字在C语言中被认为是真实的,但仍然使我感到困扰,即实现与Rs规则不一致。 我想知道是否有原因为什么没有重构这些原语以保持一致性(在C中进行某种类型检查)。
-
@Puzhu我同意。 如果这些功能无论其底层实现如何都表现出一致的行为,那就更好了。