在浏览器()中完成和继续有什么区别?

seb*_*n-c 20 debugging r

在帮助文件中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)

所以那里也没有区别.

tak*_*kje 9

有一点不同.

  • 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)

据我所知,两者之间没有实际区别,除非在上下文堆栈中存在实际目的.调试模式没有附加值.调试标志仅在您输入函数时打开浏览器,但由于您已经在函数内部,因此不会触发其他效果.


Kel*_*reu 0

您可以将其视为其他语言中的finisha break。发生的情况是,由于某种条件(例如找到特定项目或会导致错误的项目),您不再关心迭代中的其他项目。

continue另一方面,将停止在循环的当前行,忽略代码块的其余部分,并继续迭代中的下一项。如果您打算遍历迭代中的每个项目并忽略满足跳过条件的项目,则可以使用此选项。