43

別の質問では、sapply(substitute(...()), as.character)が関数内で使用され、関数に渡された名前が取得されました。そのas.character部分は良さそうに聞こえますが、いったい何をするの...()でしょうか?

の外部では有効なコードではありませんsubstitute:

> test <- function(...) ...()
> test(T,F)
Error in test(T, F) : could not find function "..."

さらにいくつかのテストケース:

> test <- function(...) substitute(...())
> test(T,F)
[[1]]
T

[[2]]
F

> test <- function(...) substitute(...)
> test(T,F)
T
4

1 に答える 1

26

...()これは、なぜそのように機能するのかのスケッチです。後で詳細と参考文献を記入しますが、これは重要なポイントに触れています。

  1. コンポーネントのいずれかで置換を実行する前に、substitute()まず R ステートメントを解析します。

  2. ...()は呼び出しオブジェクトに...解析されますが、名前オブジェクトに解析されます。

  3. ...関数呼び出しでのみ使用することを意図した特別なオブジェクトです。結果として、置換を実装する C コード...は、呼び出しオブジェクトで見つかった場合に特別な処理を行います。シンボルとして出現する場合、同様の予防措置は取られません。...(関連するコードは、 の関数do_substitutesubstitute、およびsubstituteList(特に後の 2 つ) にありR_SRCDIR/src/main/coerce.cます。)

()そのため、 inの役割は...()、ステートメントを呼び出し (別名言語) オブジェクトとして解析することであり、置換によってドットの完全に展開された値が返されます。...が の外側にある場合でも が置換されるのは驚くべきことのように思えるかもしれませんが()、(a) 呼び出しはリストのようなオブジェクトとして内部的に格納され、(b) 関連する C コードはその最初の要素を区別していないようです。リストとそれに続くもの。


余談substituteですが、さまざまなオブジェクトの動作やクラスを調べるには、次のような小さなサンドボックスを設定すると便利です。

f <- function(...) browser()
f(a = 4, 77, B = "char")
## Then play around within the browser
class(quote(...))  ## quote() parses without substituting
class(quote(...()))
substitute({...})
substitute(...(..., X, ...))
substitute(2 <- (makes * list(no - sense))(...))
于 2012-09-22T16:05:35.363 に答える