Доступны ли более строгие отчеты об ошибках в R? - PullRequest
7 голосов
/ 28 августа 2011

В PHP мы можем сделать error_reporting(E_ALL) или error_reporting(E_ALL|E_STRICT), чтобы получать предупреждения о подозрительном коде. В g ++ вы можете указать -Wall (и другие флаги) для дополнительной проверки вашего кода. Есть ли что-то похожее в R?

В качестве конкретного примера я реорганизовал блок кода в некоторые функции. В одной из этих функций у меня была эта строка:

 if(nm %in% fields$non_numeric)...

Много позже я понял, что упустил добавление fields в список параметров, но R не жаловался на неопределенную переменную.

Ответы [ 3 ]

6 голосов
/ 29 августа 2011

(Публикация в качестве ответа, а не комментария)

Как насчет ?codetools::checkUsage (codetools - встроенный пакет) ...?

3 голосов
/ 29 августа 2011

Это не совсем ответ, я просто не могу не показать, как вы можете явно объявить глобальные переменные.@Ben Bolker должен опубликовать свой комментарий в качестве ответа.

Чтобы не видеть глобальные переменные, вы можете использовать функцию "вверх" в одной среде - она ​​сможет видеть все стандартные функции и тому подобное (mean и т. д.), но не все, что вы помещаете в глобальную среду:

explicit.globals = function(f) {
    name = deparse(substitute(f))
    env = parent.frame()
    enclos = parent.env(.GlobalEnv)

    environment(f) = enclos
    env[[name]] = f
}

Тогда получение глобала - это просто извлечение его из .GlobalEnv:

global = function(n) {
    name = deparse(substitute(n))
    env = parent.frame()
    env[[name]] = get(name, .GlobalEnv)
}
assign('global', global, env=baseenv())

И это будетиспользуется как

a = 2
b = 3

f = function() {
    global(a)

    a
    b
}
explicit.globals(f)

И называется как

> f()
Error in f() : object 'b' not found

Лично я бы на это не пошел, но если вы привыкли к PHP, это может иметь смысл.

1 голос
/ 05 сентября 2011

Подводя итог, на самом деле нет правильного ответа: как указывают Оуэн и gsk3, функции R будут использовать глобальные переменные, если переменная не находится в локальной области видимости. Это может быть желательно в некоторых ситуациях, поэтому, как можно указать на «ошибку»?

checkUsage () не делает ничего, чего не делает встроенная проверка ошибок R (в данном случае). checkUsageEnv (.GlobalEnv) - это полезный способ проверить файл вспомогательных функций (и может быть полезен в качестве предварительного хука для svn или git; или как часть автоматизированного процесса сборки).

Мне кажется, лучшее решение при рефакторинге: в самом начале переместить весь глобальный код в функцию (например, вызвать его main()), и тогда единственным глобальным кодом будет вызов этой функции. , Сначала сделайте это, затем начните извлекать функции и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...