1

多くの R パッケージでは、式を引数として取る関数を使用できます。ただし、さらに一歩進んだものもあります。たとえば、plyr@hadley によるパッケージでは、次の名前の関数を大胆に定義しています.

> .
function (..., .env = parent.frame()) 
{
    structure(as.list(match.call()[-1]), env = .env, class = "quoted")
}
<environment: namespace:plyr>

私の環境で?'.'は、「どのパッケージにもトピックのヘルプが見つかりません」というメッセージが表示されます。.()表面的には、周囲の環境を自動的にキャプチャする遅延評価のメカニズムを提供しているように見えます。

> x <- c(1,2,3)
> dot <- .(x + 10)
> dot
List of 1
 $ x + 10: language x + 10
 - attr(*, "env")=<environment: R_GlobalEnv> 
 - attr(*, "class")= chr "quoted"
> dot[[1]]
x + 10
> eval(dot[[1]])
[1] 11 12 13

それだけですか?属性の目的は理解できenvますが、なぜclass = "quoted"重要なのですか?

R が式を定義しなければならないさまざまなメカニズムと、評価の遅延と強制のすべてについて、.()式を渡すときにパターンを使用する利点とコストにはどのようなものがありますか?

4

1 に答える 1

1

から?'.'

詳細

同様のトリックは代替で実行できますが、関数を複数の方法で呼び出すことができる場合、値が正しいフレームから抽出されることを確認するのがますます難しくなります。代用のトリックは、それらを使用する関数に対してプログラムすることも困難にしますが、引用されたクラスは文字列を適切なデータ構造に変換する as.quoted.character を提供します。

于 2012-12-23T04:53:14.207 に答える