更新2 @G。 Grothendieckは2つのアプローチを掲示しました。 2つ目は、関数内の関数環境を変更することです。これは、あまりにも多くのコーディング複製の問題を解決します。スクリプトをパッケージ化するときにCRANチェックをパスするのがよいかどうかはわかりません。私はいくつかの結論があるときに私は再び更新されます。Rでは、関数内の変数を関数内の下位レベルの関数で使用する方法を教えてください。(with、attach、environment)
更新
私はf5
でwith
とf6
を使用しようとした理由があり、env$c, env$d, env$calls
として関数内のすべての変数をf2
への入力引数の変数の多くを渡すために、インデックスにはしたくないしようとしています(変更されたf2
)。しかし、assign
はwith
外assign
を移動、{}
内部with
では動作しない仕事をするが、私の実際のケースでは、私は簡単にwith
機能のうち、それらを移動する方法がわからないwith
式の内部数assign
秒を持っています。ここで
は一例です:
## In the <environment: R_GlobalEnv>
a <- 1
b <- 2
f1 <- function(){
c <- 3
d <- 4
f2 <- function(P){
assign("calls", calls+1, inherits=TRUE)
print(calls)
return(P+c+d)
}
calls <- 0
v <- vector()
for(i in 1:10){
v[i] <- f2(P=0)
c <- c+1
d <- d+1
}
return(v)
}
f1()
機能f2
f2
が呼び出されたときに、f1
内にある、それは環境environment(f1)
の変数calls,c,d
を探します。これは私が欲しかったものです。 を他の関数でも使用したい場合は、代わりにグローバル環境でこの関数を定義します。f4
とします。
f4 <- function(P){
assign("calls", calls+1, inherits=TRUE)
print(calls)
return(P+c+d)
}
それはグローバル環境ではなく、関数が呼び出される関数の内部でcalls,c,d
を探しますので、これは、動作しません。例えば:
f3 <- function(){
c <- 3
d <- 4
calls <- 0
v <- vector()
for(i in 1:10){
v[i] <- f4(P=0) ## or replace here with f5(P=0)
c <- c+1
d <- d+1
}
return(v)
}
f3()
安全な方法は、f4
の入力引数でcalls,c,d
を定義する必要があり、その後、f4
にこれらのパラメータを渡します。しかし、私の場合、この関数に渡す変数が多すぎるf4
それは環境として渡すことができ、f4
は地球環境(environment(f4)
)で見ていないと言うと、environment
f3
が呼び出されたとき。
私が今解決する方法は、環境をリストとして使用し、with
機能を使用することです。 assign
は、元のオブジェクトを変更しないので、それがあるべきよう
f5 <- function(P,liste){
with(liste,{
assign("calls", calls+1, inherits=TRUE)
print(calls)
return(P+c+d)
}
)
}
f3 <- function(){
c <- 3
d <- 4
calls <- 0
v <- vector()
for(i in 1:10){
v[i] <- f5(P=0,as.list(environment())) ## or replace here with f5(P=0)
c <- c+1
d <- d+1
}
return(v)
}
f3()
しかし、今assign("calls", calls+1, inherits=TRUE)
は動作しません。変数calls
は、目的関数がf5
である最適化関数に接続されています。これが入力引数としてcalls
を渡す代わりにassign
を使用する理由です。 attach
を使っても私には分かりません。ここでassign
問題を修正するための私の方法は次のとおりです。
f7 <- function(P,calls,liste){
##calls <<- calls+1
##browser()
assign("calls", calls+1, inherits=TRUE,envir = sys.frame(-1))
print(calls)
with(liste,{
print(paste('with the listed envrionment, calls=',calls))
return(P+c+d)
}
)
}
########
##################
f8 <- function(){
c <- 3
d <- 4
calls <- 0
v <- vector()
for(i in 1:10){
##browser()
##v[i] <- f4(P=0) ## or replace here with f5(P=0)
v[i] <- f7(P=0,calls,liste=as.list(environment()))
c <- c+1
d <- d+1
}
f7(P=0,calls,liste=as.list(environment()))
print(paste('final call number',calls))
return(v)
}
f8()
私がチェックCRANを通過する場合は特に、これは正しい方向にR.アムIで行われるべきかどうかはわかりませんよ?誰もがこれについていくつかのヒントを持っていますか?
これは私が望む結果をもたらしますが、私は自分の要求をはっきりと書きませんでした。実際には、 'f2'に渡すすべての変数をインデックスすることを避けたい、つまり' env $ 'を書いていない、それで' with 'を使ってみたのです。私は 'f2'の中で外側の'呼び出し 'を変更することはできますが、現在の環境では他の変数は変更したくありません。私は質問を更新します。 – Zhenglei
私は2番目のアプローチを追加しました。 –
私は必要なもののように見えます。私は実際のケースでそれをテストし、後でアップデートします。助けてくれてありがとう! – Zhenglei