我想逐步完成一个R脚本。我在搜索如何执行此操作时看到了“debug”命令,但这似乎只适用于函数。该脚本没有任何功能。
“浏览器”命令看起来很有前景,所以我把“browser()”作为我脚本的第一行,但是当我运行它时似乎没有做任何事情。
如何让脚本在第一行暂停,以便逐步完成?
答案 0 :(得分:17)
我正试图在RStudio的IDE版本0.98.1102中解决这个问题(通过一个没有特定功能的脚本来调用)。
RStudio中新脚本的解决方案:
ctrl+shift+n
)break point
依据
break point
(红点)或browser()
添加到您要设置break point
的代码行Source on Save
框(Source
窗口上方),然后保存文件,Source
窗口右上角的Source
按钮,debugSource("<yourfilename>")
中输入enter
+ Console
或ctrl+shift+s
有关在RStudio中调试的更多步骤,请参阅此help file (2015年4月23日12:59)。
答案 1 :(得分:8)
我偏爱RStudio,所以我推荐以下内容:
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>
只会被调用一次。