Какие функции R не подходят для использования в программах?

Некоторые функции, такие как browser, имеют смысл только при интерактивном использовании.

Широко считается, что функция subset должна использоваться только в интерактивном режиме.

Аналогично, sapply не подходит для использования в программах, поскольку он не упрощает результат для входов с нулевой длиной.

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

План состоит в том, чтобы сделать инструмент для проверки пакетов, чтобы узнать, вызвана ли какая-либо из этих функций и выдает предупреждение.

Существуют и другие функции, такие как file.choose и readline, которые требуют интерактивности, но это нормально для включения в пакеты, поскольку конечное использование будет интерактивным. Я не очень-то разбираюсь в них в этом случае, но не стесняйтесь добавлять их в список.

Какие функции я пропустил?

Ответ 1

(Не стесняйтесь редактировать.)

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

  • Функции, чьи выходы не имеют согласованного выходного класса в зависимости от входов: sapply, mapply (по умолчанию)

  • Функции, внутреннее поведение которых зависит от входной длины: sample, seq

  • Функции, которые оценивают некоторые из своих аргументов в средах: $, subset, with, within, transform.

  • Функции, которые идут против обычного использования среды: attach, detach, assign, <<-

  • Функции, которые допускают частичное совпадение: $

  • Функции, которые имеют смысл только при интерактивном использовании: browser, recover, debug, debugonce, edit, fix, menu, select.list

  • Функции, которые могут быть угрозой (вирусом), если они используются с пользовательскими входами: source, eval(parse(text=...)), system.

Кроме того, в некоторой степени, каждая функция генерирует предупреждения, а не ошибки. Я рекомендую использовать options(warn = 2), чтобы превратить все предупреждения в ошибки в приложении программирования. Тогда конкретные случаи могут быть разрешены через suppressWarnings или try.

Ответ 2

Это ответ на комментарий после вопроса на плакате. Эта функция вводит функцию и возвращает плохие функции, найденные с их номером строки. Он может генерировать ложные срабатывания, но они являются лишь предупреждениями, поэтому это не кажется слишком плохим. Измените bad, чтобы удовлетворить.

badLines <- function(func) {
    bad <- c("sapply", "subset", "attach")
    regex <- paste0("\\b", bad, "\\b")
    result <- sort(unlist(sapply(regex, FUN = grep, body(func), simplify = FALSE)))
    setNames(result, gsub("\\b", "", names(result), fixed = TRUE))
}
badLines(badLines)

## sapply1  subset  attach sapply2 
##       2       2       2       4