调试时,我经常想知道已完成执行的函数中使用的变量的值。怎么能实现呢?
示例:
我有功能:
MyFunction <- function() {
x <- rnorm(10) # assign 10 random normal numbers to x
return(mean(x))
}
我想知道存储在 x 中的值,在函数执行完毕后我无法使用这些值,并清除了函数的环境。
答案 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)
。