我有一个R脚本,它接受命令行参数,顶行是:
#!/usr/bin/Rscript --slave
我想中断函数中的执行(因此我可以交互式地使用由该点加载的数据变量来计算我需要编写的下一部分代码)。我在有问题的函数中添加了这个:
browser()
但它会被忽略。一些搜索表明它可能是因为程序在非交互模式下运行。但是更多的搜索没有追踪我如何将脚本切换到非交互模式,以便浏览器()可以工作。类似browser_yes_I_really_mean_it()
函数的东西。
P.S。我想尽可能避免改变脚本的其余部分。我目前的方法是将准备数据所需的代码块复制并粘贴到交互式会话中;但随着剧本变得越来越复杂,这变得越来越不合理。
更新:对于其他有相同问题的人来说,实际问题的答案似乎是不可能的。一旦你以非交互模式启动R,就会抛出骰子。因此,给定的答案是变通方法:要么你破解你的代码(记得以后再破解它),要么重构以使调试更容易。 (此评论不是对答案的批评;建议的重构使代码更加清晰。)
答案 0 :(得分:22)
您可以启动R并获取源文件吗?
R
source("script.R")
答案 1 :(得分:5)
根据mdsumner的回答,我编辑了我的脚本:
if(!exists("argv")){
argv=commandArgs(TRUE)
if(length(argv)!=4)usage_and_exit()
}else{
if(length(argv)!=4){
stop("Must set argv as a 4 element vector. E.g. argv=c(...)")
}
}
然后不需要进行其他更改,我能够做到:
R
> argv=c('a','b','c','d')
> source("script.R")
答案 2 :(得分:0)
在某些情况下,建议的解决方案(变通方法)可能不起作用 - 例如,当 R 代码需要作为现有 bash 脚本的一部分运行时。对于这些情况,我建议使用 here document 将 R 脚本写入 bash 脚本:
#!/bin/bash
R --interactive << EOT
# R code starts here
argv=c('a','b','c','d')
print(interactive())
# Rest of script contents
quit("no")
# R code ends here
EOT
这样,上面的 print(interactive())
将产生 TRUE
。
旁注:确保避免在 R 代码中使用 $
字符,因为这将无法正确处理 - 例如,使用 data.frame()
从 df[["X1"]]
中检索列df$X1
。