2@Gを更新します 。グロタンディークは2つのアプローチを投稿しました。2つ目は、関数内の関数環境を変更することです。これにより、コーディングの複製が多すぎるという私の問題が解決します。スクリプトをパッケージにするときに、これがCRANチェックを通過するのに適した方法かどうかはわかりません。結論が出たらまた更新します。
アップデート
私は多くの入力引数変数をに渡そうとしてf2
いますが、関数内のすべての変数をとしてインデックス付けしたくないので、and (変更された)でenv$c, env$d, env$calls
使用しようとしました。ただし、内部では機能しません。外部に移動すると機能しますが、実際の場合、式の内部にいくつかのsがあり、関数から簡単に移動する方法がわかりません。with
f5
f6
f2
assign
with
{}
assign
with
assign
with
with
次に例を示します。
## 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
は内部f1
にあり、が呼び出されると、環境内のf2
変数を検索します。これが私が欲しかったものです。calls,c,d
environment(f1)
ただし、他の関数でも使用したい場合はf2
、代わりにグローバル環境でこの関数を定義し、と呼びます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()
安全な方法はcalls,c,d
、の入力引数で定義してから、f4
これらのパラメータをに渡す必要がありますf4
。ただし、私の場合、この関数に渡すには変数が多すぎるためf4
、環境として渡すことができf4
、グローバル環境()を参照せず、 whenが呼び出されenvironment(f4)
たときにのみ内部を参照するように指示する方がよいでしょう。environment
f3
私が今それを解決する方法は、環境をリストとして使用し、with
関数を使用することです。
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)
。assign
変数calls
は、目的関数がである最適化関数に接続されていますf5
。これが、入力引数としてassign
渡す代わりに使用する理由です。calls
使用する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()
Rでこれをどのように行うべきかわかりません。特にCRANチェックを通過するとき、私は正しい方向に向かっていますか?誰かがこれについていくつかのヒントを持っていますか?