2010-01-26 3 views
3

Есть ли способ, в R, всплывающим сообщение об ошибке, если функция использует переменную не объявленную в теле функции: то есть, я хочу, чтобы кто-то флаг этого типа функцияЕсть ли у нас больше ошибок (сообщений)?

aha<-function(p){ 
    return(p+n) 
} 

видеть; если где-то есть переменная «n», aha (p = 2) даст мне «ответ», так как R просто возьмет «n» из таинственного места, называемого «средой»

+4

Это обычно называется «особенностью» :) Это было бы одинаково на C или C++, между прочим, с определением области от локальной функции до следующего слоя, обычно глобальной. –

ответ

18

Если вы хотите обнаружить такие потенциальные проблемы на этапе написания кода и не во время выполнения, то пакет codetools - ваш друг.

library(codetools) 
aha<-function(p){ 
    return(p+n) 
} 

#check a specific function: 
checkUsage(aha) 

#check all loaded functions: 
checkUsageEnv(.GlobalEnv) 

Это скажет вам, что no visible binding for global variable ‘n’.

1

Запись R коды для проверки другого R-кода будут сложными. Вам нужно будет найти способ определить, какие биты кода были объявлениями переменных, а затем попытаться выяснить, были ли они уже объявлены внутри функции. EDIT: предыдущее утверждение было бы правдой, но, как заметила Анико, тяжелая работа уже была выполнена в пакете codetools.

Одна из связанных вещей, которая может быть полезной для вас, - заставить переменную быть взятой из самой функции (а не из окружающей среды).

Эта измененная версия вашей функции всегда будет терпеть неудачу, поскольку n не объявлен.

aha <- function(p) 
{ 
    n <- get("n", inherits=FALSE) 
    return(p+n) 
} 
5

Предложение Ричи очень хорошее.

Я бы добавил, что вам следует подумать о создании модульных тестовых примеров, которые будут работать в чистой среде R. Это также устранит проблему глобальных переменных и гарантирует, что ваши функции будут вести себя так, как должны. Вы можете рассмотреть возможность использования RUnit. У меня есть свой тестовый пакет, который планируется запускать каждую ночь в новой среде с использованием RScript, и это очень эффективно и ловить любые проблемы с охватом и т. Д.

+0

+1 для чистой среды - это то, что я использую «r» от littler все время, и есть Rscript, если вы на одной платформе, которую мы не поддерживаем для littler. –

Смежные вопросы