2012-04-21 19 views
12

R programing for those coming from other languagesでジョン・クックは、S-PLUSは、静的スコープを使用しながら、字句スコープと静的スコープの違いは何ですか?

Rはレキシカルスコープを使用していることを言います。この違いは、特にクロージャを使用するときには微妙になります。

私はいつも語彙スコープと静的スコープを同義語と考えていたので、私はこの奇妙なことを発見しました。

レキシカルスコープと静的スコープには異なる属性がありますか、これはコミュニティからコミュニティへ、人から人へと変化する区別ですか?そうであれば、一般的なキャンプは何ですか、どうやってそれらを区別するのですか。

+0

私は、それらが「字句」の代わりに「動的」を意味すると思っています。 – Mehrdad

+2

@Mehrdad Rは動的スコープではありません – efrey

+0

Weiird ..彼らが何を意味するのか興味があります。知らせてくれてありがとうございます。 – Mehrdad

答えて

10

Wikipedia(およびI)は、「字句範囲」と「静的範囲」という用語が同義であることに同意します。 This Lua discussionは区別をしようとしますが、人々はその区別が何であるかについて同意しません。 :-)

私は、主に実行される最新の実行レコードよりも別の機能起動レコード(「スタックブロック」)の名前にアクセスすることと区別しているように思えます(のみ?)ネストされた関数で発生しますレキシカルスコープを持つ

function f: 
    var x 
    function h: 
     var y 
     use(y) -- obviously, accesses y in current activation of h 
     use(x) -- the question is, which x does this access? 

、答えは「hの活性化と呼ばれるfの活性化」であるとダイナミックスコープでそれは任意の変数を持っている「最新の活性化を意味し、 x "(これはfではないかもしれません)。一方、言語がxの使用を全く禁止している場合、答えは「エラー」なので、「xはこれです」という疑問はありません。 :-)この第3のケースを参照するために "静的スコープ"を使用する人もいます。

+1

言い換えれば、閉鎖のない語彙スコープ? – Mehrdad

+2

はい。もちろん私は(OPのように)実際に彼らが意味することを推測しています。 – torek

+0

面白い... +1クール – Mehrdad

4

は、公式ドキュメントもRとS-プラス間の範囲の違いに対処し、R: http://cran.r-project.org/doc/manuals/R-intro.html#Scope

リンクから与えられた例は次のように簡素化することができる:S-plusから

cube <- function(n) { 
    sq <- function() n*n 
    n*sq() 
} 

結果Rは異なります:

## first evaluation in S 
S> cube(2) 
Error in sq(): Object "n" not found 
Dumped 
S> n <- 3 
S> cube(2) 
[1] 18 
## then the same function evaluated in R 
R> cube(2) 
[1] 8 

私は個人的にRの変数を治療する方法がより自然だと思います。