如何在函数内查看变量的值?

时间:2012-10-06 11:28:22

标签: r

  

可能重复:
  General suggestions for debugging R?

调试时,我经常想知道已完成执行的函数中使用的变量的值。怎么能实现呢?

示例:

我有功能:

MyFunction <- function() {
    x <- rnorm(10) # assign 10 random normal numbers to x
    return(mean(x))
}

我想知道存储在 x 中的值,在函数执行完毕后我无法使用这些值,并清除了函数的环境。

4 个答案:

答案 0 :(得分:4)

您提到了调试,因此我假设稍后在脚本中不需要这些值,您只想检查发生了什么。在这种情况下,我总是使用browser

MyFunction <- function() {
    browser()
    x <- rnorm(10) # assign 10 random normal numbers to x
    return(mean(x))
}

这会让您进入功能范围内的交互式控制台,让您可以检查内部发生的事情。

有关R中调试的一般信息,我建议this SO post

答案 1 :(得分:2)

MyFunction <- function() {
    x <- rnorm(10) # assign 10 random normal numbers to x
    return(list(x,mean(x)))
}

这将返回一个列表,其中第一个元素是x,第二个元素是它的平均值

答案 2 :(得分:1)

这里有很多选择。最简单的方法是在分配给<<-时使用x运算符。它也最有可能是get you into trouble

> test <- function() x <- runif(1)
> x <- NA
> test()
> x
[1] NA
> test <- function() x <<- runif(1)
> test()
> x
[1] 0.7753325

修改

@PaulHeimstra指出你喜欢这个用于调试。这是一个指向一些常规技巧的指针:

General suggestions for debugging in R

我建议您设置options(error=recover)或将trace()browser()结合使用。

答案 3 :(得分:1)

已经有一些很好的解决方案,我想补充一种可能性。我强调你想要知道已完成执行的函数中使用的变量的值。因此可能没有必要分配这些值,并且您不希望(先验)停止执行。解决方案是简单地使用print。因此默认情况下不使用它,但只有在您想要调试时,打印或不打印的选项可以作为函数参数传递:

MyFunction <- function(x, y, verbose = FALSE) {
    a <- x * y
    if (verbose) print(a)
    b <- x - y
    if (verbose) print(b)
    return(a * b)
}

一般情况下,您可以按照以下方式运行您的功能:MyFunction(10, 4)但是当您想要查看这些中间结果时,请执行MyFunction(10, 4, verbose = TRUE)