我知道您可能厌倦了再次回答同一问题,但我仍然收到 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)
- 那么,我还做错了什么?
- 我真的需要
.
在.envir
?怎么样.exclude
和.threshold
? - 为什么我会得到
argument "..." is missing, with no default
错误? - 为什么我会得到
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/