我希望有一个R函数,它允许我模拟R控制台,不同之处在于表达式在与全局环境不同的环境中进行评估。 (我想在R中使用它作为替代调试方法,它允许恢复调用函数的本地参数,然后通过将功能代码逐步粘贴到仿真R控制台中进行调试)。下面是一个使用解析和eval和做这项工作中途功能(模拟的控制台按下Esc键时停止):在R /仿真R控制台中解析多行表达式
my.console = function() {
while(TRUE) {
tryCatch({
expr.out <- capture.output(eval(parse(prompt=": ")))
if (length(expr.out)>0) {
cat(expr.out,"\n")
}
}, error = function(e) {
str = as.character(e)
message(str)
})
}
}
console.env = new.env(parent=globalenv())
console.env$hello = "Hello World"
environment(my.console) <- console.env
my.console()
一个然后可以在模拟控制台,例如计算简单表达式
: 5*5
[1] 25
: hello
[1] "Hello World"
问题是我无法解析多行代码,当从我的脚本粘贴if语句的开始时,会抛出错误。
: if (TRUE) {
Error in parse(prompt = ": "): 2:0: unexpected end of input
R控制台意识到更多代码将在下一行中执行并将提示更改为+。我想知道是否也有类似行为的解析函数的变体。 到目前为止,我唯一的想法是在错误消息中搜索子串“意外的输入结束”,以及是否发现它继续解析。但例如因为一些R错误消息似乎取决于R运行的语言,所以我对这种方法并不满意。有没有人知道我该如何编写一个更好的仿真R控制台来解析多行R代码?
感谢您的建议,但我的目标是为调试提供一种替代方法,我在CRAN包restorepoint实现。封装小插曲详细描述了它,为什么我更喜欢它通过browser()设置的断点。到目前为止,该软件包似乎与我的肮脏的解决方法一起工作......但如果在R中有一种更简洁的方式来模拟解析多行表达式的自定义控制台,那将会很不错。 –