R: promise 已在评估中

标签 r lazy-evaluation callstack

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

promise already under evaluation: recursive default argument reference or earlier problems?

尽管我确实遵循了前置 "." 的“麻烦”建议:

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错误?

谢谢!

最佳答案

当调用 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"

关于R: promise 已在评估中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17310825/

相关文章:

ruby - 如何找到运行时调用 Ruby 方法的位置?

r - Shiny 的表格格式

arrays - R - 基于另一个数组连接字符串元素

scala - 覆盖值的行为的原理

Python 惰性求值器

c++ - 使用 mingw 编译时增加堆栈大小?

c++ - _chkstk() 函数的目的是什么?

r - 在保留组位置的同时进行排序

r - 如何在基本 R 公式中使用类似 quosure 的语法?

scala - 延迟 val 解析的优雅方式