3

私はここで奇妙なことに遭遇しました:

https://stackoverflow.com/a/11084038/636656

基本関数と同じ名前を割り当てても、基本関数を使用できるようです。

> print <- FALSE
> print
[1] FALSE
> print("hi")
[1] "hi"
> 
> sum <- FALSE
> sum(1:10)
[1] 55
> sum
[1] FALSE

対照的に、基本関数と同じ名前に関数を割り当てても、同じ動作は発生しません。

> sum <- function(x) x^2
> sum(1:10)
 [1]   1   4   9  16  25  36  49  64  81 100
> sum
function(x) x^2

これらが異なる名前空間にあることは知っていますが、次の2つのことに興味があります。

  1. 理由:これは、回復が困難な動作(上書きした場合などrm)を回避するためのフェイルセーフですか?この振る舞いを予測する原理は何ですか?

  2. 方法:名前空間ごとに関数と論理のルックアップルーチンは異なりますか?

4

1 に答える 1

4

への呼び出しを評価するときprint()、Rは(通常の検索パスに沿って)という名前の関数printを検索します。オブジェクトprint <- TRUEには正しい名前が付いていますが、関数ではないため、検索は正しい名前の最初の関数のすぐ前まで実行されます。

これは、「データ分析のためのソフトウェア:Rを使用したプログラミング」の「第13章:Rのしくみ」からのJohnChambersの説明です。

関数呼び出しの評価は、名前に対応する関数を探すことから始まります。「検索」のルールは、上記の名前を評価するための一般的なルールと同じですが、評価者が関数ではないオブジェクトが見つかった場合は黙って無視し、非ローカル関数と同じ名前のローカル非関数オブジェクトを許可する点が異なります。 、「c」などのオブジェクト名を割り当てる人々の傾向によって動機付けられた譲歩。

(私は、これが「人々の傾向によって動機付けられた譲歩」であることについての最後のビットが特に好きです;)


match.fun()これに興味があるので、「他のタイプのオブジェクトとの望ましくない一致を避けながら、目的の関数オブジェクトを抽出する」ように設計された、も一見の価値があります。これには、次の行が含まれています。これは、評価者と評価者の両方が使用する戦略をうまく示しています。

FUN <- get(as.character(FUN), mode = "function", envir = envir)
于 2012-06-18T16:59:41.200 に答える