我想要一个 R 函数,它允许我模拟 R 控制台,不同之处在于表达式是在与全局环境不同的环境中评估的。(我想将它用于 R 中的另一种调试方法,该方法允许恢复调用函数的本地参数,然后通过简单地将函数代码逐步粘贴到模拟的 R 控制台中进行调试)。这是一个使用 parse 和 eval 并在中途完成工作的函数(按 Escape 时模拟控制台停止):
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 控制台意识到下一行将跟随更多代码并将提示更改为 +。我想知道是否还有具有类似行为的 parse 函数的变体。到目前为止,我唯一的想法是一种非常肮脏的方法来搜索错误消息中的子字符串“unexpected end of input”,如果发现它继续解析。但是,例如,由于某些 R 错误消息似乎取决于 R 运行的语言,因此我对这种方法并不满意。有谁知道我如何编写一个可以解析多行 R 代码的更好的模拟 R 控制台?