2

重複の可能性:
独自の関数を作成するときにRの省略記号機能を使用するにはどうすればよいですか?

Rが...引数をどのように解釈するのか疑問に思っていますか?

たとえばmakeContrasts(..., contrasts=NULL, levels)、パッケージのを考えてみましょうlimma。実行できます:

 > require(limma)
 > makeContrasts(a + b, b+c, levels=letters[1:3])

       Contrasts
 Levels a + b b + c
      a     1     0
      b     1     1
      c     0     1

また、Rオブジェクトとして定義されていないa + b, b+cパラメータを解釈します。a, bc

私は同様の機能を作ろうとしました:

foo = function(...) {
    print(typeof(...))
}

> foo(a + b) 
Error in typeof(...) : object 'a' not found

だから私は本当にどのタイプのオブジェクトが実際に渡されるのか混乱していmakeContrastsますか?そして、とにかくこのオブジェクトを変更することはありますか?

4

1 に答える 1

3

それは「言語表現」です。インタプリタに渡すとtypeof、一致する名前を見つけようとしてa失敗するため、エラーが発生します。「言語」タイプのアイテムを処理する関数で処理した場合、(より)賢明な結果が得られます。

これを見てください:

> a="aa"
> typeof(a+b)
Error in typeof(a + b) : object 'b' not found
> b="bb"
> typeof(a+b)
Error in a + b : non-numeric argument to binary operator

の存在しないことを修正したa後、Rインタープリターが見つけられるようにしたかったのですが、数値引数が与えられbていないことに気づきました。+そのため、通訳者はa+b通常の方法で式を評価し、問題が発生したときに問題を報告しようとしていました。模倣についての当時の不完全な質問に対する私の回答ではmakeContrasts、Rインタープリターがその式で何をしているかを確認するためのメカニズムを提供しました。

 foo = function(...) {
      e <- substitute(...)
      e[[1]]
 }

  foo(a + b)
# `+`

ワークスペース内の名前付き要素ではないものの性質を調べたい場合typeofは、他の方法で文字値を取得することを期待している場合は、次のことを行う必要がありますquote

> typeof(quote(a+b))
[1] "language"
> typeof(quote("a"))
[1] "character"
于 2012-10-05T00:14:27.610 に答える