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 は大文字がまったく同じ名前に自動的に一致するというルールはありますか?

4

2 に答える 2

6

これについては、R 言語定義の「引数の一致」セクションで説明されています。

このサブセクションはクロージャに適用されますが、プリミティブ関数には適用されません。後者は通常、タグを無視して位置マッチングを行いますが、log、round、signif、rep、seq.int などの例外についてはヘルプ ページを参照する必要があります。

関数の評価で最初に行われるのは、仮引数と実際の引数または指定された引数の照合です。これは、次の 3 つのパス プロセスによって行われます。

タグの完全一致。指定された指定された引数ごとに、仮引数のリストが検索され、名前が完全に一致する項目が検索されます。同じ仮引数が複数の実引数に一致する場合、またはその逆の場合はエラーになります。

タグの部分一致。指定された残りの各名前付き引数は、部分一致を使用して残りの仮引数と比較されます。指定された引数の名前が仮引数の最初の部分と正確に一致する場合、2 つの引数は一致すると見なされます。部分一致が複数あるとエラーになります。2 番目の実引数は のみに一致しますが、 if f <- function(fumble, fooey) fbody, thenf(f = 1, fo = 2)は不正であることに注意してくださいfooeyf(f = 1, fooey = 2)ただし、2 番目の引数が正確に一致し、部分一致の考慮から除外されるため、正当です。仮引数に「...」が含まれている場合、部分一致はその前の引数にのみ適用されます。

位置合わせ。一致しない仮引数は、指定された名前のない引数に順番にバインドされます。'...' 引数がある場合、タグ付けされているかどうかに関係なく、残りの引数が使用されます。

于 2013-04-02T14:45:15.390 に答える
6

引数を一致させる主な方法は 3 つあります。これらについては、 R Language DefinitionのArgument Matchingセクションで説明されています。関連するセクションを以下に再現します。

関数の評価で最初に行われるのは、仮引数と実際の引数または指定された引数の照合です。これは、次の 3 つのパス プロセスによって行われます。

  1. タグの完全一致。指定された指定された引数ごとに、仮引数のリストが検索され、名前が完全に一致する項目が検索されます。同じ仮引数が複数の実引数に一致する場合、またはその逆の場合はエラーになります。
  2. タグの部分一致。指定された残りの各名前付き引数は、部分一致を使用して残りの仮引数と比較されます。指定された引数の名前が仮引数の最初の部分と正確に一致する場合、2 つの引数は一致すると見なされます。部分一致が複数あるとエラーになります。2 番目の実引数は のみに一致しますが、 if f <- function(fumble, fooey) fbody, thenf(f = 1, fo = 2)は不正であることに注意してくださいfooeyf(f = 1, fooey = 2)ただし、2 番目の引数が正確に一致し、部分一致の考慮から除外されるため、正当です。仮引数に含まれる場合、...部分一致はその前の引数にのみ適用されます。
  3. 位置合わせ。一致しない仮引数は、指定された名前のない引数に順番にバインドされます。引数がある場合は...、タグ付けされているかどうかに関係なく、残りの引数が使用されます。

これは、通常の関数で発生することに注意してください。プリミティブ関数は R では特別です。プリミティブは多くの点で特別であり、常にタグを使用せず、代わりに位置マッチングを使用します。ただし、これは一貫して適用されるわけではありません。

もう 1 つの重要な例外は、引数を含む関数の...引数です。前述のように、引数が関数の引数リストの にある場合、これらの引数に位置一致が適用されていない場合...は、その関数の呼び出しでその引数に名前を付ける必要があります。例えば:

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

に値を渡す唯一の方法yは、関数呼び出しで名前を付けることです。

foo(y = 1)
于 2013-04-02T14:51:27.997 に答える