4

我想要一个 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 控制台?

4

2 回答 2

1

为什么不尝试将您的代码输入和parse命令分开,例如,

s <- scan(what="list", multi.line=TRUE)
for(i in 1:length(s)){
    capture.output(eval(parse(text=s)[i]))
    # etc...
}
于 2013-05-03T06:04:59.930 回答
0

如果您想以交互方式逐步完成您的代码,您可以使用browser()带有 command的内置函数n,请参阅?browser. 示例使用:

f <- function(x) {
  # invoke interactive debugging
  browser()

  # rest of the function - by pressing 'n' while in browser mode, the expressions
  # will be executed one after another and you are able to explore the
  # intermediate values of variables etc. (as in standard R promt)
  y <- x^2
  [...]
}

如果这不符合您的需求,您可以查看browser.

于 2012-12-18T20:22:25.577 回答