5

functionR では、4 番目の要素が常に最初の 3 つの要素で構成されているように見えるという意味で、演算子の解析ツリーが冗長に見えることに気付きました。

例えば、

> as.list(substitute(function(x = 1){x^2}))
[[1]]
`function`

[[2]]
[[2]]$x
[1] 1


[[3]]
{
    x^2
}

[[4]]
function(x = 1){x^2}

私が気づいたことの 1 つは、関数が入力された形式が 4 番目の要素に格納されていることです。

> as.list(substitute(function(x = 1){
+ x^2})[[4]]
function(x = 1){
x^2}

解析ツリーのこの 4 番目の要素の目的は何ですか? それが使用されているのを見ることができるのは、関数を逐語的に印刷したい場合だけです。これは、関数を印刷することですでに実行できます。

> f = function(x = 1){
+ x^2}
> f
function(x = 1){
x^2}
4

2 に答える 2

5

どうやら、このコンポーネントはソース参照です。R 言語定義で簡単に見つけることはできませんが、その目的は、元のソース、特にコメントの構造を正確に保持することです。例えば

s <- substitute(function(x=1){ 
      ## a comment
       x^2})
str(s[[4]])
##  Class 'srcref'  atomic [1:8] 1 21 2 15 21 15 1 2
##   ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x8a87634>

オブジェクトであることを示していsrcrefます。不可解な数字 (1、21、2、15、...) は、?srcfileページ (つまりc(first_line, first_byte, last_line, last_byte, first_column, last_column, first_parsed, last_parsed)) で説明されているように、ソース コードを表す下位レベル オブジェクトへのインデックスを表します。@SimonO101 が指摘しているように、Duncan Murdoch による R Journal の記事がおそらく最も適切な説明を提供しています。

于 2013-06-12T00:07:36.883 に答える
2

いくつかの追加メモ:

1) 以下を使用してこの機能を無効にすることができoptions(keep.source=FALSE)ます (デフォルトはTRUE):

> as.list(substitute(function(x = 1){x^2}))
[[1]]
`function`

[[2]]
[[2]]$x
[1] 1


[[3]]
{
    x^2
}

[[4]]
NULL

このlistでは、最初の要素はクロージャー オブジェクトを識別するシンボルであり、2 番目の要素は を保存しformals、3 番目の要素は を保存しbodyます。この最後のものは「標準的な」方法で印刷されることに注意してください。4 番目の要素は、入力テキストを入力どおりに保存します。

2)function(x = 1){x^2}コンソールで入力すると、R は引数print.functionを受け取る を呼び出します。useSourceこれはTRUEデフォルトであり、R は解析リストの 4 番目の要素に格納されているものを単純に繰り返すようになります。FALSER に関数を強制的に出力するように設定すると、次のようになりますbody

> options(keep.source=TRUE)
> f <- function(x = 1){x^2}
> f
function(x = 1){x^2}
> print.function(f)
function(x = 1){x^2}
> print.function(f, useSource=FALSE)
function (x = 1) 
{
    x^2
}
于 2013-06-12T12:47:11.277 に答える