我正在使用browser()在R中调试一个函数,并且遇到了一些我不理解的东西。下面是一个简单的示例函数:
testf<-function(x)
{
if(x==1) x=x+1
return(x)
}
如果我运行它,它的行为就像预期的那样:
> testf(1)
[1] 2
> testf(2)
[1] 2
现在,我插入一个browser()函数以进入调试模式:
testf<-function(x)
{
browser()
if(x==1) x=x+1
return(x)
}
如果我现在在调试模式下运行testf(1)并使用下一个命令特性来逐步执行该函数,它将产生预期的输出2。但是,如果我直接运行If语句(例如,通过突出显示和按run按钮),x不会增加:
Browse[1]> x
[1] 1
Browse[1]> if(x==1) x=x+1
debug at #3: x = x + 1
Browse[3]> x
[1] 1
如果我自己运行x=x+1,那么x就会增加:
Browse[3]> x
[1] 1
Browse[3]> x=x+1
Browse[3]> x
[1] 2
Browse[3]>
那么x就会像预期的那样增加。
为什么?我对调试模式的理解是,您可以运行任何命令,它将被执行,就像运行函数一样,但是上面的if语句似乎并非如此。
我在这里错过了什么?
发布于 2022-01-27 18:20:26
if
条件分两个步骤工作:
计算condition
以这种方式想象发生的事情也许更容易:
testf <- function(x)
{
browser()
if(x==1) {
x=x+1
}
return(x)
}
发布于 2022-01-27 19:45:34
我将根据沃尔迪以上的回答,对我的问题提供一个更详细的答案。我问题的真正核心是:为什么我的if语句在正常模式和调试模式下表现不同?
> x=1
> if(x==1) x=x+1
> x
[1] 2
> testf(1)
Called from: testf(1)
Browse[1]> x
[1] 1
Browse[1]> if(x==1) x=x+1
debug at #3: x = x + 1
Browse[3]> x
[1] 1
通过使用调试器逐步完成该函数,就可以看到答案。当我使用下一个工具通过if时,它需要两个步骤才能通过,而不是我们可能期望的一个步骤。这是因为if涉及两个步骤:
计算condition
通常情况下,这些都是同时执行的。但是,调试器将它们分开。这大概是因为错误可能出现在评估步骤或执行步骤中。这是合理的,但其副作用是,如果我在调试模式的命令行中运行 if ,它只执行第一部分(求值),而不执行第二部分(执行)。
https://stackoverflow.com/questions/70883544
复制相似问题