Почему “ “ лучше, чем `подмножество`?

Когда мне нужно отфильтровать data.frame, т. Е. Извлечь строки, соответствующие определенным условиям, я предпочитаю использовать функцию subset :

 subset(airquality, Month == 8 & Temp > 90) 

Вместо функции [ function:

 airquality[airquality$Month == 8 & airquality$Temp > 90, ] 

Для моих предпочтений есть две основные причины:

  1. Я считаю, что код читается лучше, слева направо. Даже люди, которые ничего не знают о R, могут сказать, что делает вышеприведенное заявление.

  2. Поскольку столбцы можно назвать переменными в выражении select , я могу сэкономить несколько нажатий клавиш. В моем примере выше, я только должен был набирать airquality один раз с subset , но три раза с [ .

Таким образом, я жил счастливым, используя subset повсюду, потому что он короче и читается лучше, даже защищая его красоту среди моих соратников-кодеров. Но вчера мой мир развалился. Читая документацию subset , я замечаю этот раздел:

Предупреждение

Это функция удобства, предназначенная для интерактивного использования. Для программирования лучше использовать стандартные функции подмножества, такие как [, и, в частности, нестандартная оценка подмножества аргументов может иметь непредвиденные последствия.

Может ли кто-нибудь помочь прояснить, что означают авторы?

Во-первых, что они подразумевают под « для интерактивного использования »? Я знаю, что такое интерактивный сеанс, в отличие от сценария, запускаемого в режиме BATCH, но я не вижу, какую разницу он должен сделать.

Тогда вы могли бы объяснить « нестандартную оценку подмножества аргументов » и почему это опасно, может быть, привести пример?

На этот вопрос ответили хорошо в комментариях @James, указывая на отличное объяснение Хэдли Уикхэма об опасностях subset (и подобных ему функций) [здесь] . Пойдите, прочитайте это!

Это несколько длинное чтение, поэтому может быть полезно записать здесь пример, который использует Хэдли, который наиболее непосредственно затрагивает вопрос «что может пойти не так?»:

Хэдли предлагает следующий пример: предположим, что мы хотим подмножество, а затем переупорядочить кадр данных, используя следующие функции:

 scramble <- function(x) x[sample(nrow(x)), ] subscramble <- function(x, condition) { scramble(subset(x, condition)) } subscramble(mtcars, cyl == 4) 

Это возвращает ошибку:

Ошибка в eval (expr, envir, enc): объект 'cyl' не найден

потому что R больше не «знает», где можно найти объект под названием «цил». Он также указывает на действительно причудливые вещи, которые могут произойти, если случайно в глобальной среде есть объект, называемый «цил»:

 cyl <- 4 subscramble(mtcars, cyl == 4) cyl <- sample(10, 100, rep = T) subscramble(mtcars, cyl == 4) 

(Запустите их и убедитесь сами, это довольно сумасшедший.)

Также [ быстрее:

 require(microbenchmark) microbenchmark(subset(airquality, Month == 8 & Temp > 90),airquality[airquality$Month == 8 & airquality$Temp > 90,]) Unit: microseconds expr min lq median uq max neval subset(airquality, Month == 8 & Temp > 90) 301.994 312.1565 317.3600 349.4170 500.903 100 airquality[airquality$Month == 8 & airquality$Temp > 90, ] 234.807 239.3125 244.2715 271.7885 340.058 100 
  • Как определить операторы подмножества для classа S4?
  • Обновить подмножество data.table на основе объединения
  • Выбор строк из фрейма данных на основе значений в векторе
  • Возвращать временные frameworks подмножества данных в другие временные frameworks?
  • Подмножество строк, содержащих значения NA (отсутствует) в выбранном столбце кадра данных
  • Как итеративно генерировать k элементов подмножеств из набора размера n в java?
  • Кадр данных подмножества, основанный на количестве строк на группу
  • Interesting Posts

    Как эффективно выполнять преобразования double / int64 с помощью SSE / AVX?

    Как передать параметр -D или переменную среды в Spark?

    ОШИБКА: Имя источника данных не найдено и указанный драйвер по умолчанию не указан

    Полиморфизм. Является ли объект ORM субъектом домена или объектом данных?

    CORS в ASP.NET MVC5

    Как создать трапециевидное изображение с помощью css?

    Захват нажатия клавиш в фоновом режиме

    Как я зацикливаю таблицу excel 2010, используя его имя и колонку?

    Почему значения даты / времени неверно интерпретируются при исправлении / сохранении?

    Разница между статическим и относительным позиционированием

    Как обеспечить обратную связь по бета-версиям Windows?

    Рекурсивная итерация jQuery по объектам

    C # эквивалентно charAt ()?

    Как использовать Apple Script для изменения раскладки клавиатуры на Snow Leopard?

    Как избежать «экземпляра» при реализации шаблона проектирования завода?

    Давайте будем гением компьютера.