Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R函数有没有办法判断它是否';是从'for'还是'while'循环调用的?_R_For Loop_Scope_While Loop - Fatal编程技术网

R函数有没有办法判断它是否';是从'for'还是'while'循环调用的?

R函数有没有办法判断它是否';是从'for'还是'while'循环调用的?,r,for-loop,scope,while-loop,R,For Loop,Scope,While Loop,这个问题的标题很清楚地说明了这一点:R函数有没有办法确定它是直接调用的,还是从for或while循环的内部调用的sys.frame(0)或parent.frame(1)返回.GlobalEnv函数是直接调用还是从其中一个循环内部调用的。那么,还有别的办法吗 谢谢。为什么不使用一个可选参数作为示例 Blah <- function(Param1, OptionalParam = 0){ if(OptionalParam == 1){ #Do This }els

这个问题的标题很清楚地说明了这一点:R函数有没有办法确定它是直接调用的,还是从
for
while
循环的
内部调用的
sys.frame(0)
parent.frame(1)
返回
.GlobalEnv
函数是直接调用还是从其中一个循环内部调用的。那么,还有别的办法吗


谢谢。

为什么不使用一个可选参数作为示例

Blah <- function(Param1, OptionalParam = 0){
    if(OptionalParam == 1){
        #Do This
    }else{
        #Do this
    }
    #Everything Else
}

Blah这不是一个确定的答案,但我认为您的解决方案将是查看
sys.status
,特别是
sys.parents
。第二个示例用于在另一个函数内和循环内调用该函数。在不明确知道的情况下,不确定如何区分这一点

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>

testOops,这还为时过早。结果表明,索引变量在
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);
    }
  }
}

replaceincall不幸的是,
for
通常不会出现在
sys.calls中。虽然这有点像黑客,但实际上您可以覆盖
,从而将其包括在内:

`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"

我认为在这个问题的背景下给出好的建议是很重要的。你的目的是什么?你想做什么?我已经为
@f1r3br4编写了一个包装函数,唯一想到的是
?loadhistory
。我知道有一些问题,所以人们窃取他们的历史,你可能会考虑四处窥探。你看过的包装上的CRN,如果跟踪对象是你打算做什么?我知道-因为我知道我正在调用它从一个循环,明确地告诉它的功能。一个问题是,我的函数是通过设计一个二进制运算符来实现的。我可能可以通过设置
options()
来解决这个问题。但更大的问题是,如果我把它打包给其他人使用(因为男孩确实解决了一个长期被忽视的问题),手动告诉它它在一个循环中比自动检测循环和以不同于显式调用的方式记录循环要不友好得多。噢,拜托,不要投票给家长响应者。他可能错过了关于这是R语言的部分,但他提出的建议与我的问题相关,即使我因为上述原因不能这样做。是的,我同意从函数内部检查会更容易,但调用函数时发送的唯一信息是该函数的参数。您可以尝试创建一个模块,将父函数分配给一个函数,然后允许您设置父调用类型,但这同样不利于用户。使用可选参数将是最简单的,然后只需添加一些好的注释来帮助其他人developers@AlexMurrayf13br4nd提到它是一个二进制运算符,因此不可能直接发送其他可选参数。我实际上不使用r代码。这更多的是一个psudo代码,您可以计算出restPlease仅对实际答案使用“发布答案”按钮。您应该修改原始问题以添加其他信息。
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>
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);
    }
  }
}
`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"