如何在 RStudio 中以调试模式 运行 for 循环?
How to run for loop in debug mode within RStudio?
我有以下代码来获得可重现的错误:
cc <- function(){
a(2)
}
a <- function(b){
x <- rep(NA, 3)
for(nr in 1:3){
x[nr] <- nr
}
a*2
}
cc()
(请注意,这是一个示例错误,我没有兴趣解决它。这只是一个最小的可重现示例,它允许我有一个我们进入调试模式的示例)。
我将 RStudio 与调试设置一起使用:"Break in Code"(调试 - 出错 - 代码中断)。
调试时我想 运行 for 循环但我不能:
> cc()
Error in a * 2 : non-numeric argument to binary operator
Called from: a(2)
Browse[1]> x <- NULL
Browse[1]> for(nr in 1:3){
+ x[nr] <- nr
+ }
debug at #2: x[nr] <- nr
Browse[4]> x
NULL
问题:
如何在调试模式下运行 for循环、if语句、while等(并将相应的结果存储在"debugging Environment"中)?
(准确地说,我可以 运行 代码,如上例所示。但是 x 的值不会改变)。
编辑:我为什么要这个?
有时我在我的代码中遇到意外错误,为了更好地理解它,我希望在我的代码的特定 "error part" 之前/之后执行代码。这很好用,除了 运行for 循环的结果没有保存到 "temporary debug Environment" 中,如示例所示。
因此,用 sapply 或类似方法替换 for 循环不会解决问题,因为同样的挑战适用于 while、if 等
我试过的:
browser()
可以在 for 循环中设置。但我不想事先设置
.我也不需要在 for 循环的某个点中断?
- 使用
recover()
我希望循环中的内容不是我可以通过 recover()
,...
访问的额外环境
尝试遵循 James Curran 的解决方案:
> debug(cc)
> cc()
debugging in: cc()
debug at
#1: {
a(2)
}
Browse[2]> debug(a)
Browse[2]> a(2)
debugging in: a(2)
debug at #1: {
x <- rep(NA, 3)
for (nr in 1:3) {
x[nr] <- nr
}
a * 2
}
Browse[4]> x <- rep(NA, 3)
Browse[4]> for(nr in 1:3){
+ x[nr] <- nr
+ }
debug at #2: x[nr] <- nr
Browse[5]> a*2
Error in a * 2 : non-numeric argument to binary operator
Browse[7]> x
[1] NA NA NA
我似乎没有更改 X,(我希望我按照说明正确操作)。
使用 R 中的 debug
函数。在调用 cc
之前执行
debug(cc)
然后调用cc
。在调试模式下输入 cc
后,您可能还想调试 a
,因此键入
debug(a)
然后继续。
这次试试怎么样?
> debug(a)
> cc()
这样调试就开始只在一个函数中起作用了。
我有以下代码来获得可重现的错误:
cc <- function(){
a(2)
}
a <- function(b){
x <- rep(NA, 3)
for(nr in 1:3){
x[nr] <- nr
}
a*2
}
cc()
(请注意,这是一个示例错误,我没有兴趣解决它。这只是一个最小的可重现示例,它允许我有一个我们进入调试模式的示例)。
我将 RStudio 与调试设置一起使用:"Break in Code"(调试 - 出错 - 代码中断)。
调试时我想 运行 for 循环但我不能:
> cc()
Error in a * 2 : non-numeric argument to binary operator
Called from: a(2)
Browse[1]> x <- NULL
Browse[1]> for(nr in 1:3){
+ x[nr] <- nr
+ }
debug at #2: x[nr] <- nr
Browse[4]> x
NULL
问题:
如何在调试模式下运行 for循环、if语句、while等(并将相应的结果存储在"debugging Environment"中)?
(准确地说,我可以 运行 代码,如上例所示。但是 x 的值不会改变)。
编辑:我为什么要这个?
有时我在我的代码中遇到意外错误,为了更好地理解它,我希望在我的代码的特定 "error part" 之前/之后执行代码。这很好用,除了 运行for 循环的结果没有保存到 "temporary debug Environment" 中,如示例所示。
因此,用 sapply 或类似方法替换 for 循环不会解决问题,因为同样的挑战适用于 while、if 等
我试过的:
browser()
可以在 for 循环中设置。但我不想事先设置 .我也不需要在 for 循环的某个点中断?- 使用
recover()
我希望循环中的内容不是我可以通过 recover()
,...
尝试遵循 James Curran 的解决方案:
> debug(cc)
> cc()
debugging in: cc()
debug at
#1: {
a(2)
}
Browse[2]> debug(a)
Browse[2]> a(2)
debugging in: a(2)
debug at #1: {
x <- rep(NA, 3)
for (nr in 1:3) {
x[nr] <- nr
}
a * 2
}
Browse[4]> x <- rep(NA, 3)
Browse[4]> for(nr in 1:3){
+ x[nr] <- nr
+ }
debug at #2: x[nr] <- nr
Browse[5]> a*2
Error in a * 2 : non-numeric argument to binary operator
Browse[7]> x
[1] NA NA NA
我似乎没有更改 X,(我希望我按照说明正确操作)。
使用 R 中的 debug
函数。在调用 cc
之前执行
debug(cc)
然后调用cc
。在调试模式下输入 cc
后,您可能还想调试 a
,因此键入
debug(a)
然后继续。
这次试试怎么样?
> debug(a)
> cc()
这样调试就开始只在一个函数中起作用了。