2

I'm working in R, and I want to do, for example,

printx <- function() {
  x <- 1
  printy()
  return(x)
}

printy <- function() {
  print(x)
}

because I don't want to keep passing around tons of variables (also, there is no x in the global environment). Is there a way to do this? All functions can access the global environment but what about the ones between the function's environment and the global?

4

2 に答える 2

5

多分

printx <- function() {
  x <- 1
  printy()
  return(x)
}

printy <- function() {
  print(get('x',envir=parent.frame()))
}

> x<-0
> printy()
[1] 0
> printx()
[1] 1
[1] 1

これは、関数が呼び出された環境に関連付けられたx出力されるを使用します。printy

もう1つの可能性は、新しい環境を作成することです

e1<-new.env(parent = baseenv())

> assign('x',12,envir=e1)
> x
[1] 0
> get('x',e1)
[1] 12
于 2012-07-31T00:58:15.967 に答える
3

上記でほのめかされたリスクに関連するリスクなしで、クロージャーを使用して同様の結果を得ることができます。あなたが何をしようとしているのかを正確に知らなければ、関連する例を提示することは困難です。しかし、以下のコードは興味深いかもしれません...

create.functions <- function(x){
    list(
        function() x,
        function() x+1,
        function() x^2
    )

}

x <- 0

f1 <- create.functions(5)
f1[[1]]()
[1] 5
f1[[2]]()
[1] 6
f1[[3]]()
[1] 25

f2 <- create.functions(3)
f2[[1]]()
[1] 3
f2[[2]]()
[1] 4
f2[[3]]()
[1] 9

x
[1] 0

グローバル環境でパラメーターxとxの値の間に競合が発生することなく、同じパラメーターxを共有する一連の関数を作成できることに注意してください。xのパラメーターが異なる方法で定義されている新しい関数のセットが必要な場合は、新しいセットを作成するだけです。

これは、パラメーターの値を変更するときに一連の関数に依存するコードを編集する必要がないように機能することもできます。

f <- create.functions(5)
f[[1]]()/f[[3]]()
[1] 0.2

f <- create.functions(3)
f[[1]]()/f[[3]]()
[1] 0.3333333

同じコード行がf[[1]]()/f[[3]]()、パラメータxの定義方法に応じて異なる結果を返すことに注意してください。

于 2012-07-31T01:45:03.170 に答える