在为browser
帮助文件中,有两个似乎非常类似的选项:浏览器中完成和继续有什么区别?
f
电流环路的执行完成或功能
c
退出浏览器并继续执行下一条语句。
他们之间有什么区别,在什么情况下差异明显?
什么可能是差一些线索 - 我写了一个与以下内容称为browse.R
脚本:
for (i in 1:2){
browser()
print(i)
}
这是使用c
VS f
结果:
> source("browse.R")
Called from: eval(expr, envir, enclos)
Browse[1]> c
[1] 1
Called from: eval(expr, envir, enclos)
Browse[1]> c
[1] 2
> source("browse.R")
Called from: eval(expr, envir, enclos)
Browse[1]> f
[1] 1
Browse[2]> f
[1] 2
注意Browse[n]
的等级发生变化。这仍然没有强调它们之间的任何实际区别。
我也想看看是否也许事情会从浏览器环境消失:
for (i in 1:2){
a <- "not modified"
browser()
print(a)
}
Called from: top level
Browse[1]> a <- "modified"
Browse[1]> f
[1] "modified"
Browse[1]> a
[1] "not modified"
Browse[1]> a <- "modified"
Browse[1]> c
[1] "modified"
所以没有区别有两种。
的C内部和'这里F'大约一半, :https://github.com/wch/r-source/blob/e5b21d0397c607883ff25cca379687b86933d730/src/main/main.c [Ctrl + F为'ParseBrowser(SEXP CExpr,SEXP rho)'],但我的c不够强了解代码执行的不同当然 – Chris
它可能是一个错误?预期的'f'行为是你完成当前函数,然后返回到浏览器(不退出)。当您查看源代码时,也会出现这种差异(请参阅上面的注释)。当输入'c'时,结果是'SET_RDEBUG(rho,0);'其中rho是指向调用浏览器的函数的指针。然而,当你看看'f'部分时,它将调试状态设置为true:'SET_RDEBUG(rho,1);'但是只有在退出函数(指针消失)之后,它应该将rho的调试状态设置为高一级在堆栈轨迹上。只是一个想法,不知道是否正确。 – takje
@takje在这种情况下,浏览器不会更高,会吗?它会爆发并重新开始。 –