2

次のようなRコードがあります。

func1 = function(a) {

  func2 = function(a) {
    return(a+2)
  }

  func3 = function(a) {
    return(a+3)
  }
  return(a+func2(a))
}

func1 の外部から func2 または func3 を呼び出すことは可能ですか? 例えば。実行方法:

x <- func2(10) #from the console?
4

2 に答える 2

1

関数クロージャーを作成できます。

##I've removed the brackets and return to shorten the function
func1 = function(a) {
  func2 = function(a) a+2
  func3 = function(a) a+3
  return(list(func2=func2, func3=func3))
}

クロージャーを使用して変数を共有できます。

func1 = function(a) {
    a = a
    func2 = function() a + 2
    func3 = function() a + 3 
    return(list(func2=func2, func3=func3))
}

f = func1(50)
f$func2()
f$func3()
于 2012-12-07T09:11:21.620 に答える
0

いいえ、できません。

func2 は func1 のスコープで定義されます。

しかし、質問は本当にあいまいです! netsed 関数はすべて、グローバル スコープにアクセスできます。

a <- 10
function <- f(x){
   g <- function(y=x) x+a
   g(x)
}

ここで、関数 g はネストされており、自由変数 a を持っています。インタプリタは g と f のスコープ内でロックし、次に f のローカル フレーム (グローバル) で a の値を探します。

グローバルとしてアクセスしたいのに、ネストされた関数をネストされたものとして定義するのはなぜですか?

于 2012-12-07T09:12:21.737 に答える