2013-04-02 2 views
3
f=function(s,abc=0,def=0) { 
    return(s+def) 
} 

f(3) 
[1] 3 
f(3,d=4) 
[1] 7 

Почему R соответствует «d» с «def»?Почему неполное записанное имя в функции R могло найти совпадение?

Есть ли правило, в котором указано, что имя переменной не может быть найдено в функции, тогда R будет автоматически соответствовать имени, заглавные буквы которого совпадают с ним?

+1

R использует [частичное соответствие] (http://stackoverflow.com/вопросы/14153904/частичное соответствие-о-функция-аргумент). – Arun

+0

Спасибо за вашу ссылку. Я новичок в R и нашел некоторые необычные вещи. – elixiao

ответ

6

Существует три основных метода, по которым сопоставляются аргументы. Они обсуждаются в Argument Matching части R Language Definition, соответствующий раздел, который я воспроизвожу ниже:

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

  1. Точное совпадение по тегам. Для каждого присваиваемого аргумента в списке формальных аргументов выполняется поиск элемента, имя которого точно соответствует . Ошибочно иметь один и тот же формальный аргумент, соответствующий нескольким действительным или наоборот.
  2. Частичное совпадение по тегам. Каждый оставшийся аргумент, предоставленный по умолчанию, сравнивается с остальными формальными аргументами с использованием частичного соответствия. Если имя предоставленного аргумента совпадает с первой частью формального аргумента, то два аргумента считаются . Ошибочно иметь несколько неполных совпадений. Обратите внимание, что , если f <- function(fumble, fooey) fbody, то f(f = 1, fo = 2) является незаконным, хотя 2-й фактический аргумент соответствует только fooey. f(f = 1, fooey = 2) является законным, хотя второй аргумент точно соответствует и исключен из рассмотрения для частичного соответствия . Если формальные аргументы содержат ..., то частичное совпадение применяется только к предшествующим аргументам.
  3. Позиционное согласование. Любые непревзойденные формальные аргументы привязаны к неназванным предоставленным аргументам в порядке. Если есть аргумент ..., он принимает оставшиеся аргументы, помеченные тегами или нет.

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

Другим важным исключением являются аргументы в функциях, которые включают аргумент .... Как упоминалось выше, если аргумент возникает после... в списке аргументов функции, вы должны назвать этот аргумент при вызове этой функции , если, поскольку позиционное сопоставление не применяется к этим аргументам. Например:

foo <- function(x, ..., y) { 
    y 
} 

Единственный способ передать значение y, чтобы назвать его в вызове функции, например:

foo(y = 1) 
5

Это описано в разделе определения языка R Argument Matching.

Этот подраздел относится к закрытию, но не к примитивным функциям. Последние обычно игнорируют теги и выполняют позиционное сопоставление, но их справочные страницы следует использовать для исключений, которые включают журнал, round, signif, rep и seq.int.

Первое, что происходит при оценке функции, - это сопоставление формальных с фактическими или поставленными аргументами. Это осуществляется с помощью трехпроходного процесса :

Точное совпадение по тегам. Для каждого аргумента, предоставленного по имени, в списке формальных аргументов выполняется поиск элемента, имя которого точно совпадает. Ошибка в том, что один и тот же формальный аргумент соответствует нескольким действиям или наоборот.

Частичное соответствие по тегам. Каждый оставшийся присваиваемый аргумент сравнивается с остальными формальными аргументами с использованием частичного соответствия . Если имя предоставленного аргумента соответствует точно с первой частью формального аргумента, то два аргумента равны , которые считаются согласованными. Ошибочно иметь несколько неполных совпадений . Обратите внимание, что если f <- function(fumble, fooey) fbody, то f(f = 1, fo = 2) является незаконным, хотя 2-й фактический аргумент соответствует fooey. f(f = 1, fooey = 2) является законным, хотя второй аргумент соответствует точно и исключается из рассмотрения для частичного соответствия . Если формальные аргументы содержат «...», то частичное совпадение применяется только к предшествующим ему аргументам.

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

+0

+1 Ты был там первым. (И несколько смущающе, что ОП принял мой очень похожий ответ) –

+0

@GavinSimpson: Великие мысли думают одинаково! –

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