在帮助文件中browser,有两个看起来非常相似的选项:
f
完成当前循环或函数的执行
c
退出浏览器并在下一个语句处继续执行.
他们之间有什么区别,在什么情况下差别很明显?
关于可能有什么区别的一些线索 - 我编写了一个browse.R带有以下内容的脚本:
for (i in 1:2){
browser()
print(i)
}
Run Code Online (Sandbox Code Playgroud)
这是使用cvs 的结果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
Run Code Online (Sandbox Code Playgroud)
注意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"
Run Code Online (Sandbox Code Playgroud)
所以那里也没有区别.
有一点不同.
c 立即退出浏览器(和调试模式),然后以正常方式执行其余代码.f相反,在执行函数/循环的其余部分时保持在浏览器(和调试模式).函数/循环结束后,他也返回正常执行模式.资料来源:R-source(第1105-1117行)和R-help
这有一些含义:
c关闭浏览器.这意味着从函数调用新的浏览器调用.因此,您将看到以下行:Called from: function().f另一方面,不会关闭浏览器,因此你不会看到这一行.此行为的源代码是在这里:HTTPS://github.com/wch/r-source/....f留在浏览器中,f还会跟踪上下文级别:浏览器提示的格式为Browse [n]>:此处var {n}表示"浏览器级别".浏览时可以调用浏览器(通常是在使用调试时),每次递归调用都会增加数量.(实际数字是上下文堆栈中'contexts'的数量:对于外部浏览级别通常为2,在调试器中检查转储时为1)
可以使用以下代码测试这些差异:
> test <- function(){
browser()
browser()
}
> test()
Called from: test()
Browse[1]> c
Called from: test()
Browse[1]> c
> test()
Called from: test()
Browse[1]> f
Browse[2]> f
Run Code Online (Sandbox Code Playgroud)
据我所知,两者之间没有实际区别,除非在上下文堆栈中存在实际目的.调试模式没有附加值.调试标志仅在您输入函数时打开浏览器,但由于您已经在函数内部,因此不会触发其他效果.
您可以将其视为其他语言中的finisha break。发生的情况是,由于某种条件(例如找到特定项目或会导致错误的项目),您不再关心迭代中的其他项目。
continue另一方面,将停止在循环的当前行,忽略代码块的其余部分,并继续迭代中的下一项。如果您打算遍历迭代中的每个项目并忽略满足跳过条件的项目,则可以使用此选项。