2013-11-25 2 views
0

Я написал много функций в R, и иногда я получаю проблемы с глобальными и локальными переменными. Чтобы быть более точным, если у меня есть следующие глобальные переменные и функции:Аргументы/имена параметров в R - проблемы с локальными переменными

# Defined before function, globally: 
ret <- 0.12314 
fa <- 789989.938 

prasx <- function(ret, fa, ctry, arb, x = "4"){ 
# do some stuff... 
return (yxc) 
} 

Тогда я вызываю функцию через:

prasx(ret, fa, 'US', 3874.38) # OR 
prasx('US', 3874.38) 

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

Я хотел бы знать, является ли это хорошим способом записи функций в R, или если вам лучше использовать разные имена аргументов/параметров для функций, чем имена глобальных переменных. Очень часто вы просто хотите перенаправить глобальную переменную на функцию; поэтому я обычно даю им равные имена. Также я думаю, что всегда безопаснее избегать вызова функции ниже, без спецификаций?

Спасибо.

ответ

3

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

Вы определили функцию с 5 аргументов:

prasx <- function(ret, fa, ctry, arb, x = "4"){ 
# do some stuff... 
return (yxc) 
} 

только один со значением по умолчанию, заданный в x, со значением по умолчанию 4. Это означает, что любой другой аргумент, если он используется в функции, должен появиться в вызове функции. Поэтому вызов prasx('US', 3874.38) всегда будет генерировать ошибку, если либо ctry, либо arb ссылаются в любой точке внутри функции. например

x <- 4 
f <- function(x,y){x} 
> f(y = 3) 
Error in f(y = 3) : argument "x" is missing, with no default 

Это последний бит может спутали вас, потому что вы, вероятно, думал, что вы проходили 'US' аргументу ctry, но вы не являетесь. R вычисляет аргументы функции в три этапа. Во-первых, путем точного сопоставления имени аргумента, затем частичного согласования по имени аргумента и, наконец, по позиции. Поскольку вы не указали ни один аргумент в prasx('US', 3874.38), R интерпретировал это как эквивалент prasx(ret = 'US',fa = 3874.38). (См here.)

Вашего вызова функции первого пример будет эквивалентен следующему:

prasx(ret = ret,fa = fa,ctry = 'US',arb = 3874.38) 

При программировании (в отличие от работы в интерактивном режиме на консоли), то почти всегда лучше называть свои функции, используя их полные, именованные аргументы. Его легче читать, меньше подвергать ошибкам и легче отлаживать.

+0

спасибо! Теперь я получил это :) Я не могу проголосовать за вас, потому что у меня нет достаточной репутации: / – user3032689

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