如何从头开始单步执行R脚本?

时间:2011-09-20 13:59:08

标签: debugging r

我想逐步完成一个R脚本。我在搜索如何执行此操作时看到了“debug”命令,但这似乎只适用于函数。该脚本没有任何功能。

“浏览器”命令看起来很有前景,所以我把“browser()”作为我脚本的第一行,但是当我运行它时似乎没有做任何事情。

如何让脚本在第一行暂停,以便逐步完成?

6 个答案:

答案 0 :(得分:17)

我正试图在RStudio的IDE版本0.98.1102中解决这个问题(通过一个没有特定功能的脚本来调用)。

RStudio中新脚本的解决方案:

  1. 创建新的R脚本(ctrl+shift+n
  2. 在文件中输入代码
  3. 设置break point依据
    • a)点击要设置break point(红点)或
    • 的代码行号的左侧
    • b)将browser()添加到您要设置break point的代码行
  4. 保存文件
  5. 进入调试模式并通过以下方式获取文件
    • a)检查Source on Save框(Source窗口上方),然后保存文件,
    • b)点击Source窗口右上角的Source按钮,
    • c)在debugSource("<yourfilename>")中输入enter + Console
    • d)输入ctrl+shift+s
  6. 完成调试过程
  7. 有关在RStudio中调试的更多步骤,请参阅此help file (2015年4月23日12:59)。

答案 1 :(得分:8)

我偏爱RStudio,所以我推荐以下内容:

  1. 下载RStudio
  2. 打开您的R脚本
  3. 将光标放在第一行
  4. 点击ctrl + enter(PC / Linux)或命令+ return(Mac)
  5. 重复!
  6. RStudio的一个很好的功能是RStudio服务器可以在无头服务器上运行良好。然后,您可以通过本地计算机上的Web浏览器中的http连接到服务器。在EC2实例上运行R时,我使用此配置。 RStudio保持状态,所以如果我在火车上失去了互联网接入,当我收到信号时,RStudio准确地从我离开的地方开始,我的远程机器不知道我断开连接并重新连接。请注意,目前仅在FC / CentOS和Debian / Ubuntu上支持RStudio服务器。虽然它可以在* nix的其他变体下编译。

答案 2 :(得分:7)

一种流行的方法是通过“IDE”或编辑器执行此操作 - Emacs / ESS做得很好,其他人也这样做。

基本思想是将游标下的行或函数或块,...发送到关联的R进程。其他几位编辑也对此表示支持,包括RStudio。我的偏好仍然是ESS,但我相信你能找到合适的东西。

最后,browser()等人可以在R进程中做到这一点,但它的点击率稍微低一点。阅读文档或Chambers“Software for Data Analysis”(Springer,2008)等书籍。

答案 3 :(得分:6)

对于仅考虑完整表达式而不是单独行的R解决方案,请尝试以下方法:

sourcep <- function(file){
  coms <- parse(file)
  for (i in seq_along(coms)){
    print(coms[[i]])
    eval(coms[[i]],envir=.GlobalEnv)
    mess <- paste("Expression",i,"of",length(coms),"parsed. Press <return> to continue.")
    cat(mess)
    readLines(n=1)
  }
}

你打电话给这个叫source(虽然这是更基本的,不包括任何选项)。基本上,它使用parse来创建源文件中已解析但未评估的表达式的列表,然后遍历此列表以打印表达式,在全局环境中对其进行评估,然后发出消息以指示进程。最后一行是创建暂停的行:从stdin()读取单行的调用。

答案 4 :(得分:5)

您在评论中提到您使用Rscript运行代码,但要进行调试,您需要以交互方式运行它。换句话说,要让browser进入&#34;工作&#34;,请启动常规R控制台并source您的脚本。由于脚本的第一行是browser(),因此您会立即返回提示,您可以使用&#34; n&#34;单步执行代码。但是,由于它是一个完整的R提示,您还可以通过键入其名称或分配给它来检查或更改任何变量值。 (或者实际上,调用任意R函数。)

答案 5 :(得分:1)

根据another answer的建议,在脚本开头插入browser(),通过运行R而不是Rscript来获取互动会话,然后使用{{1}如果您的脚本不需要commadline参数(例如argparse处理的那些),source('myscript.Rscript')来自{{1>}将会执行

如果确实需要使用命令行args运行,则可以使用R选项(例如R)调用--args,并且源脚本将看到参数,就好像它有已使用Rscript调用。 the question of how to pass commandline args to source还有其他解决方案,但他们并没有针对这一特定用例,R --no-restore --no-save --args <your commandline args here>只会被调用一次。