6

質問のタイトルはほとんどそれを言っています.R関数が直接呼び出されているのか、forまたはwhileループ内から呼び出されているのかを調べる方法はありますか? sys.frame(0)orは、関数が直接呼び出されたのか、それらのループの 1 つから呼び出されたのかをparent.frame(1)返します。.GlobalEnvでは、他の方法はありますか?

ありがとう。

4

4 に答える 4

2

これは決定的な答えではありませんが、あなたの解決策は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>
于 2012-08-06T01:59:27.563 に答える
2

残念ながら通常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"
于 2012-08-07T00:46:52.977 に答える
0

たとえば、オプションのパラメータを使用してみませんか

Blah <- function(Param1, OptionalParam = 0){
    if(OptionalParam == 1){
        #Do This
    }else{
        #Do this
    }
    #Everything Else
}
于 2012-08-06T01:36:02.253 に答える
0

おっと、それは時期尚早でした。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、それはまだ動的変数であるため、おそらくそれは良いことです。その価値を今すぐ​​捉えないとどうやって再構築するのだろう。

この推論に欠陥があると思う人はいますか?

于 2012-08-06T02:28:08.257 に答える