質問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
となっています。
(これはまた、あなたが関数が<<-
を使用して、グローバルワークスペースを変更したくない理由の一つである。)
@BigDataSci - あなたの答えをありがとう。これについて少し説明してもらえますか?私はあなたのコメントをよく理解していませんでした。 – watchtower
明示的なreturn文がない場合、関数は実行の最後の行を返します。最初の場合、 'z < - f()'は 'z'に1の値を代入します。後者の場合、' x 'を含む' x < - ls() 'の出力、 。 – discipulus