Почему min / max / sum (c (NA, 4, 5), na.rm = xyz) работает, а mean () с теми же входами - нет?

Я хотел бы понять, почему функции sum / min / max в R интерпретируют символьную строку как TRUE при передаче в na.rm, а mean() - нет.

Мое необразованное предположение состоит в том, что as.logical("xyz") возвращает NA, который передается в na.rm в качестве аргумента, который по какой-то странной причине принимается как ИСТИНА для суммы / мин / макс, в то время как это не для mean()

Ожидаемый результат для sum(c(NA, 4, 5), na.rm = "xyz") - это аргумент, который не интерпретируется как логическая ошибка (возвращается из среднего значения). Я не понимаю, почему это не так.


person Puzhu    schedule 21.05.2019    source источник
comment
Это не совпадение, что min/max/sum являются примитивами, а mean - нет. Обработка if (na.rm) вызывает ошибку в mean.default, и я предполагаю, что это не так в min/max/sum из-за того, что они являются примитивами.   -  person Rich Scriven    schedule 22.05.2019
comment
Этот QA очень похож и указывает в правильном направлении изучения исходного кода C: stackoverflow.com/a/14035586   -  person John Colby    schedule 22.05.2019
comment
например githrub.com/w источник / blob /   -  person John Colby    schedule 22.05.2019
comment
Я согласен с тем, что было бы полезно, если бы na.rm оценивался и принуждался последовательно по всем направлениям. Обратите внимание, что na.rm="FALSE" действительно анализируется как логический, поэтому это не значит, что какая-либо строка становится ИСТИННОЙ, ср. 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.   -  person HenrikB    schedule 22.05.2019
comment
Согласовано! Я не понимаю необходимости здесь непоследовательности. Я не знаком с C, но предполагаю, что какая-то строгая проверка типов должна быть простой в реализации и обеспечивать согласованное поведение по всем направлениям. Определенно был для меня WAT !? моментом.   -  person Puzhu    schedule 23.05.2019


Ответы (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 ‹- x [! Is.na (x)]: аргумент не интерпретируется как логический

что похоже на выполнение

if ("abc") "Hello"

Ошибка в if ("abc") "Hello": аргумент не интерпретируется как логический


Теперь относительно sum, min, max и других примитивных функций, которые реализованы на 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». Запустите демонстрацию здесь. Если вы передаете строковый ввод логическому типу, он рассматривается как TRUE в C. На самом деле это верно даже для чисел.

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

тоже работает.

PS - Я не эксперт в C и немного знаю R. На поиск всех этих идей ушло много времени. Сообщите мне, если я что-то неправильно истолковал и предоставил ложную информацию.

person Ronak Shah    schedule 22.05.2019
comment
Спасибо! Я предполагаю, что символьные строки и числа считаются в C правдивыми, но меня все еще беспокоит, что реализация не соответствует правилам R. Интересно, есть ли причина, по которой эти примитивы не подвергались рефакторингу для обеспечения согласованности (с какой-то проверкой типа в C). - person Puzhu; 22.05.2019
comment
@Puzhu Согласен. Было бы намного лучше, если бы эти функции демонстрировали последовательное поведение независимо от их базовой реализации. - person Ronak Shah; 23.05.2019