Какие функции 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