【问题标题】:R: promise already under evaluationR:承诺已经在评估中
【发布时间】:2013-06-23 01:06:55
【问题描述】:

我知道您可能已经厌倦了再次回答同一个问题,但我仍然收到severalotherquestions 中讨论的错误:

promise 已经在评估中:递归默认参数引用或早期问题?

尽管我确实遵循了在前面添加 "." 的“繁琐”建议:

show.large.objects.threshold <- 100000
show.large.objects.exclude <- c("closure")
show.large.objects <- function (.envir = sys.frame(),
                                threshold = show.large.objects.threshold,
                                exclude = show.large.objects.exclude) {
  for (n in print(ls(.envir, all.names = TRUE))) tryCatch({
    o <- get(n,envir = .envir)
    s <- object.size(o)
    if (s > threshold && !(typeof(o) %in% exclude)) {
      cat(n,": ")
      print(s,units="auto")
    }
  }, error = function(e) { cat("n=",n,"\n"); print(e) })
}
show.large.objects.stack <- function (.threshold = show.large.objects.threshold,
                                      skip.levels = 1,# do not examine the last level - this function
                                      .exclude = show.large.objects.exclude) {
  for (level in 1:(sys.nframe()-skip.levels)) {
    cat("*** show.large.objects.stack(",level,") ")
    print(sys.call(level))
    show.large.objects(.envir = sys.frame(level), threshold = .threshold, exclude = .exclude)
  }
}

但我仍然收到错误:

> f <- function () { c <- 1:1e7; d <- 1:1e6; print(system.time(show.large.objects.stack())) }
> f()
*** show.large.objects.stack( 1 ) f()
[1] "c" "d"
c : 38.1 Mb
d : 3.8 Mb
*** show.large.objects.stack( 2 ) print(system.time(show.large.objects.stack()))
[1] "..." "x"  
n= ... 
<simpleError in get(n, envir = .envir): argument "..." is missing, with no default>
n= x 
<simpleError in get(n, envir = .envir): promise already under evaluation: recursive default argument reference or earlier problems?>
*** show.large.objects.stack( 3 ) system.time(show.large.objects.stack())
[1] "expr"    "gcFirst" "ppt"     "time"   
n= expr 
<simpleError in get(n, envir = .envir): promise already under evaluation: recursive default argument reference or earlier problems?>
          user         system        elapsed 
    0 (0.00ms)     0 (0.00ms) 0.002 (2.00ms) 
  1. 那么,我还做错了什么?
  2. 真的需要.envir 中的. 吗? .exclude.threshold 呢?
  3. 为什么会出现argument "..." is missing, with no default 错误?
  4. 为什么会出现promise already under evaluation 错误?

谢谢!

【问题讨论】:

  • 我建议将您的示例简化为更简单的内容 - 您有很多相互关联的函数调用,而且问题所在并不明显。绝对不需要添加到. 参数名称,并且错误消息是有用的。但可能是因为惰性评估,错误实际上比您看到它时更早发生。
  • 我很难非常重现错误。
  • @hadley:我添加了一个可重现的测试用例!

标签: r lazy-evaluation callstack


【解决方案1】:

f被调用时,一个5层的堆栈被构建到show.large.objects,它开始从顶部开始评估帧的内容。

f
  -> print
     -> system.time
        -> show.large.objects.stack
           -> show.large.objects

1 级

f()

这里一切正常。

2 级

print(system.time(show.large.objects.stack()))

当您在其框架上调用ls(.envir, all.names) 时,您会得到

[1] "..." "x"  

其中... 丢失并在您对其调用get 时引发错误3,而x = system.time(show.large.objects.stack()) 当前正在被评估并引发错误4。

3 级

system.time(show.large.objects.stack())

谁的ls给你

[1] "expr"    "gcFirst" "ppt"     "time"   

其中expr = show.large.objects.stack() 当前仍在评估中,并引发另一个错误 4。

4级

show.large.objects.stack()

ls 没有粗略的东西,并且没有错误地完成。

底线

show.large.frames() 必须单独进行评估,而不是作为任何函数的参数,否则会引发错误。为什么不让它自己打印呢?

我觉得这很有帮助

> debug(show.large.objects)
> f()
Browse[2]> lapply(sys.frames(), ls)
[[1]]
[1] "c" "d"

[[2]]
[1] "x"

[[3]]
[1] "expr"    "gcFirst" "ppt"     "time"   

[[4]]
[1] "level"       "skip.levels"

[[5]]
[1] "exclude"   "threshold"

【讨论】:

  • 所以,你的意思是我应该忽略这些错误,对吧?关于什么 ”。”在 args 中?
  • 感觉有点脏,但我猜可以完成工作。 try(..., silent=TRUE) 没有人会注意到。目的是在堆栈的所有级别上显示所有对象的大小,以查看是否有任何东西无法控制?
  • 我不知道参数名称中的初始点有任何特殊功能,但认为人们通常使用它来标记与函数执行方式相关的特殊参数,而不是它产生的内容(如.inorder.verboseforeach)。我猜的另一个原因是为了您自己的方便,在调用堆栈的不同级别之间将具有相同名称的参数分开,但这不会解决您代码中的任何逻辑循环漏洞。
猜你喜欢
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 2011-05-20
  • 2011-03-05
  • 2017-10-20
  • 1970-01-01
  • 2014-01-03
  • 2017-10-18
相关资源
最近更新 更多