2016-06-24 9 views
1

私はRの新しいユーザーと私はそれはそれを行うことは可能ですかどうかを知りたいと思います:R - 変更機能環境

a = 2      <environment: R_GlobalEnv> 

f <- function(){ 
    x = 1 
    y = 1 
    g() 
}       <environment: 0xf1b79b8> 

g <- function(){ 
    z = x + y + a 
}       <environment: 0xf1b7a98> 
Error in g() : object 'x' not found 

質問:それは作成することが可能ですg()グローバルとf()環境へのパーソナライズされたアクセス?これを行うには

+0

あなたは何を達成したいのか分からない...とにかく 'f'関数内で' g'関数を定義することができます... – digEmAll

+0

g()がGlobalEnvの変数にアクセスできるかどうかを知りたいですf()からのtempEnv? –

+1

なぜg(x、y)を持っていないのですか? – toni057

答えて

3

だけで機能は、グローバルな環境から、見つからない場合は、親フレームから変数を取得したりできるようにしたい場合、これは動作し(私はそれを阻止しても*)必要があります。

g <- function(env=parent.frame()){ 
    z = get("x",envir=env) + get("y",envir=env) + get("a",envir=env) 
    return(z) 
} 

だから、この作品:

rm(list=ls(pattern='[^g]')) # to be sure the global env is empty except for g function 
a = 2      

f <- function(){ 
    x = 1 
    y = 1 
    return(g()) 
} 

f() 
# returns 4 

(*)私は主に二つの理由のためにこれを思いとどまら:

  1. コードは非常に読みやすいではない、とgが何をするか、すぐに明確ではありません、それはxyaをとるところ。
  2. 関数型プログラミングの観点からは、可能な限り(つまり外部/グローバル変数に依存しない)関数を「自己完結型」にすることと、できるだけ「ステートレス」として機能させることをお勧めしますと呼ばれる)。関数が引数で必要とするものを渡す方がはるかに優れており、関数を入力(パラメータを介して)を受け取り、操作し、出力を返すものにすることができます。
+0

他の環境を定義するのはなぜ危険ですか? –

+0

私たちはここで環境を定義しているわけではなく、デフォルトの環境を使用していないだけです...しかし、私がこのアプローチを妨げる理由は、環境のためではなく、答えの最後に追加したものです。 – digEmAll

5

一つの方法は、f()g()を定義することです:

a <- 2 

f <- function(){ 
    g <- function(){ 
     z <- x + y + a 
    }  
    x <- 1 
    y <- 1 
    g() 
} 

print(f()) ## 4 
+0

ありがとうBen :) –

関連する問題