質問のタイトルはほとんどそれを言っています.R関数が直接呼び出されているのか、for
またはwhile
ループ内から呼び出されているのかを調べる方法はありますか? sys.frame(0)
orは、関数が直接呼び出されたのか、それらのループの 1 つから呼び出されたのかをparent.frame(1)
返します。.GlobalEnv
では、他の方法はありますか?
ありがとう。
質問のタイトルはほとんどそれを言っています.R関数が直接呼び出されているのか、for
またはwhile
ループ内から呼び出されているのかを調べる方法はありますか? sys.frame(0)
orは、関数が直接呼び出されたのか、それらのループの 1 つから呼び出されたのかをparent.frame(1)
返します。.GlobalEnv
では、他の方法はありますか?
ありがとう。
これは決定的な答えではありませんが、あなたの解決策はsys.status
、特にsys.parents
. 2 番目の例は、関数が別の関数内およびループ内で呼び出される場合です。明示的に知らずにこれをどのように区別するかわかりません。
test <- function() sys.status()
for(i in 1:2){
print(test())
}
## $sys.calls
## $sys.calls[[1]]
## print(test())
##
## $sys.calls[[2]]
## test()
##
## $sys.calls[[3]]
## sys.status()
##
##
## $sys.parents
## [1] 0 0 2
##
## $sys.frames
## $sys.frames[[1]]
## <environment: 0x0479a1c8>
##
## $sys.frames[[2]]
## <environment: 0x0479a2fc>
##
## $sys.frames[[3]]
## <environment: 0x0479a334>
##
##
## $sys.calls
## $sys.calls[[1]]
## print(test())
##
## $sys.calls[[2]]
## test()
##
## $sys.calls[[3]]
## sys.status()
##
##
## $sys.parents
## [1] 0 0 2
##
## $sys.frames
## $sys.frames[[1]]
## <environment: 0x047993cc>
##
## $sys.frames[[2]]
## <environment: 0x04799570>
## $sys.frames[[3]]
## <environment: 0x047995a8>
と
test()
## $sys.calls
## $sys.calls[[1]]
## test()
##
## $sys.calls[[2]]
## sys.status()
##
##
## $sys.parents
## [1] 0 1
##
## $sys.frames
## $sys.frames[[1]]
## <environment: 0x04775500>
##
## $sys.frames[[2]]
## <environment: 0x04775538>
と
test_sq <- function() test()
for(i in 1:2){
print(test_sq())
}
## $sys.calls
## $sys.calls[[1]]
## print(test_sq())
##
## $sys.calls[[2]]
## test_sq()
##
## $sys.calls[[3]]
## test()
##
## $sys.calls[[4]]
## sys.status()
##
##
## $sys.parents
## [1] 0 0 2 3
##
## $sys.frames
## $sys.frames[[1]]
## <environment: 0x04766c60>
##
## $sys.frames[[2]]
## <environment: 0x04766dcc>
##
## $sys.frames[[3]]
## <environment: 0x04766e04>
##
## $sys.frames[[4]]
## <environment: 0x04766e3c>
##
##
## $sys.calls
## $sys.calls[[1]]
## print(test_sq())
##
## $sys.calls[[2]]
## test_sq()
##
## $sys.calls[[3]]
## test()
##
## $sys.calls[[4]]
## sys.status()
##
##
## $sys.parents
## [1] 0 0 2 3
##
## $sys.frames
## $sys.frames[[1]]
## <environment: 0x04765ac8>
##
## $sys.frames[[2]]
## <environment: 0x04765c34>
##
## $sys.frames[[3]]
## <environment: 0x04765c6c>
##
## $sys.frames[[4]]
## <environment: 0x04765d30>
と
test_sq()
## $sys.calls
## $sys.calls[[1]]
## test_sq()
##
## $sys.calls[[2]]
## test()
##
## $sys.calls[[3]]
## sys.status()
##
##
## $sys.parents
## [1] 0 1 2
##
## $sys.frames
## $sys.frames[[1]]
## <environment: 0x0475ce40>
##
## $sys.frames[[2]]
## <environment: 0x0475cee8>
##
## $sys.frames[[3]]
## <environment: 0x0475cf20>
残念ながら通常for
では登場しませんsys.calls
。ちょっとしたハックですが、実際にはオーバーライドfor
して、それを含めることができます:
`for` = function(iter, vec, expr) eval.parent(replace(sys.call(), 1, list(.Primitive('for'))))
in.for = function() '`for`' %in% lapply(sys.calls(), `[[`, 1)
my.fun = function() { print('before'); print(in.for()); print('after') }
my.fun()
# [1] "before"
# [1] FALSE
# [1] "after"
for (x in 1) my.fun()
# [1] "before"
# [1] TRUE
# [1] "after"
たとえば、オプションのパラメータを使用してみませんか
Blah <- function(Param1, OptionalParam = 0){
if(OptionalParam == 1){
#Do This
}else{
#Do this
}
#Everything Else
}
おっと、それは時期尚早でした。index 変数はfor()
ループ後も存続することがわかりました。ダーン。
うーん!私はそれを持っているかもしれません。関数内の任意の文字列を変数の内容に置き換える関数が既にあります。
replaceincall <- function(xx,from,to){
# from is a string, to is a name
if(is.name(xx)){
ifelse(as.character(xx)==from,return(to),return(xx));
} else {
if(is.call(xx)) {
oo <- lapply(as.list(xx),function(yy) replaceincall(yy,from,to));
return(as.call(oo));
} else {
return(xx);
}
}
}
オーバーロードされた関数では、関数に対応しない<<-
名前のリストも既に抽出しています。sys.call()
つまり、それらはある種の変数です。私がし。ls(.GlobalEnv)
なければならないのは、含まれていないものを見つけることであり、それらはインデックス変数である必要があり、ログエントリ内の値に置き換える必要があります (上記の関数を使用)
さて、これはループ以外のものをキャッチして置き換えるかもしれません...しかし、変数が にない理由に関係なく.GlobalEnv
、それはまだ動的変数であるため、おそらくそれは良いことです。その価値を今すぐ捉えないとどうやって再構築するのだろう。
この推論に欠陥があると思う人はいますか?