2017-02-13 13 views
1

私はまだRの初心者であり、依然として怠惰な評価を理解しています。私はSO(R functions that pass on unevaluated arguments to other functions)でかなりのスレッドを読んでいますが、私はまだ分かりません。Rの評価されていない議論

質問1:

はここに私のコードです:

f <- function(x = ls()) { 
    a<-1 
    #x ##without x 
    } 
f(x=ls()) 

私はこのコードすなわちf()を実行すると、何も返しません。具体的には、aという値は表示されません。それはなぜそうですか?

質問2:

また、私はこのコードでaの値を参照してください:私はf()によって機能を実行すると

f <- function(x = ls()) { 
    a<-1 
    x ##with x 
    } 
f(x=ls()) 

私が手:

[1] "a" "x" 

それはなぜそうですか?誰か助けてくれますか?

+0

@BigDataSci - あなたの答えをありがとう。これについて少し説明してもらえますか?私はあなたのコメントをよく理解していませんでした。 – watchtower

+0

明示的なreturn文がない場合、関数は実行の最後の行を返します。最初の場合、 'z < - f()'は 'z'に1の値を代入します。後者の場合、' x 'を含む' x < - ls() 'の出力、 。 – discipulus

答えて

3

質問1

これは遅延評価とは何の関係もありません。

関数は、最後に実行した文の結果を返します。この場合、最後の文はa <- 1でした。 a <- 1の結果は1です。あなたは、例えば1

は、引数 xはどこにも使用され、そのいずれかの役割を果たしていない
> f <- function(x = ls()) { 
+ a<-1 
+ } 
> b <- f(x=ls()) 
> print(b) 
[1] 1 

この場合には、あなたがリターンを機能し、bだから1に等しいことになるb <- a <- 1を行うことができます。

関数は、値を目に見えるように(デフォルト)または不可視に戻すことができます。目に見えない形で返すためには、関数invisibleを使うことができます。例:

この場合、f2は何も返されないようです。しかし、それでも値は1を返します。関数が呼び出され、結果が何にも割り当てられていないときに、不可視関数は何も表示しません。あなたの例との関連性は、a <- 1も目に見えない形で返ってくるということです。それはあなたの関数が何も返されないように見える理由です。上記bに割り当てられたときしかし、bはまだ1

質問2

まず値を取得し、あなたが見る結果を参照してくださいなぜ、私が説明します。結果に表示されるaは、以前のコードがいくつか発生しています。最初にワークスペースをクリーニングすると、fと表示されます。これは、変数f(関数はRの変数でもあります)を作成してからls()を実行すると意味があります。

> rm(list = ls()) 
> 
> f <- function(x = ls()) { 
+ a<-1 
+ x 
+ } 
> f(x=ls()) 
[1] "f" 

機能は何(少なくとも、あなたが期待するもの)、最初のリストすべての変数がls()その後、xとして機能するように結果を渡す場合。この関数は、xを返します。これはすべての変数のリストで、それが印刷されます。グローバルワークスペース(ない何かあなたの中に新しい変数aを作成し、これは(a <<- 1)グローバル割り当てが使用されている。この場合、作業

> rm(list = ls()) 
> 
> f <- function(x) { 
+ a <<- 1 
+ x 
+ } 
> 
> f(x = ls()) 
[1] "a" "f" 
> 

で遅延評価を表示するように変更することができますどのように

、通常はしたい)。

この場合でも、関数呼び出しの結果はちょうどfであると予想されます。 aも表示されているという事実は、遅延評価によって引き起こされます。

遅延評価なしでは、最初にls()(この時点ではfのみがワークスペースに存在します)という名前が、xという名前の関数にコピーされます。関数はxを返します。この場合、はaが作成される前に評価されます。

ただし、レイジー評価の場合、式ls()は、式の結果が必要な場合にのみ評価されます。この場合、関数が返って結果が出力されます。当時、地球環境は変化しており(a)、ls()aとなっています。

(これはまた、あなたが関数が<<-を使用して、グローバルワークスペースを変更したくない理由の一つである。)

+0

すばらしい返答。 2つの質問: 'a << - 1'とは何ですか? **質問1 **あなたの答えから、「a」は「1」に割り当てられるだけでなく、評価される(すなわち「使用される」)と思われます。正しい? **質問2 **あなたの例を最後の文として 'b <-2'を含むように少し修正しました。しかし、今は 'a'が返されることはありません。コード: 'rm(list = ls()); f < - function(x){a << -1;バツ; b←2}となる。 c <-f(x = ls()); c'これはなぜ起こっていますか?私はあなたの考えを感謝します。 'c'の値をチェックすると' 2'と表示されます。私は 'a'も期待していたでしょう。私はここで何が欠けているのか分かりません。 – watchtower

+1

@watchtower最初の質問:はい、より正確: 'a'の値は関数によって返され、' b'に代入されます。 –

+1

@watchtower 2番目の質問:最後のステートメントとして関数に 'b < - 2'を追加すると、そのステートメントの結果が関数によって返されます(最初の元の質問と同じです)。したがって、関数は '2'の値 'b'を返します。 'x'は関数で使われていますが返されないので、' ls() 'は評価されますが、その結果は使われず返されません。 –

関連する問題