2@Gを更新します 。グロタンディークは2つのアプローチを投稿しました。2つ目は、関数内の関数環境を変更することです。これにより、コーディングの複製が多すぎるという私の問題が解決します。スクリプトをパッケージにするときに、これがCRANチェックを通過するのに適した方法かどうかはわかりません。結論が出たらまた更新します。
アップデート
私は多くの入力引数変数をに渡そうとしてf2いますが、関数内のすべての変数をとしてインデックス付けしたくないので、and (変更された)でenv$c, env$d, env$calls使用しようとしました。ただし、内部では機能しません。外部に移動すると機能しますが、実際の場合、式の内部にいくつかのsがあり、関数から簡単に移動する方法がわかりません。withf5f6f2assignwith{}assignwithassignwithwith
次に例を示します。
## 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,denvironment(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)たときにのみ内部を参照するように指示する方がよいでしょう。environmentf3
私が今それを解決する方法は、環境をリストとして使用し、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チェックを通過するとき、私は正しい方向に向かっていますか?誰かがこれについていくつかのヒントを持っていますか?