首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >browser()函数在R中的行为

browser()函数在R中的行为
EN

Stack Overflow用户
提问于 2022-01-27 18:01:59
回答 2查看 39关注 0票数 2

我正在使用browser()在R中调试一个函数,并且遇到了一些我不理解的东西。下面是一个简单的示例函数:

代码语言:javascript
运行
复制
testf<-function(x)
{
  if(x==1) x=x+1  
  return(x) 
}

如果我运行它,它的行为就像预期的那样:

代码语言:javascript
运行
复制
> testf(1)
[1] 2
> testf(2)
[1] 2

现在,我插入一个browser()函数以进入调试模式:

代码语言:javascript
运行
复制
testf<-function(x)
{
  browser()
  if(x==1) x=x+1
  
  return(x)
}

如果我现在在调试模式下运行testf(1)并使用下一个命令特性来逐步执行该函数,它将产生预期的输出2。但是,如果我直接运行If语句(例如,通过突出显示和按run按钮),x不会增加:

代码语言:javascript
运行
复制
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就会增加:

代码语言:javascript
运行
复制
Browse[3]> x
[1] 1
Browse[3]> x=x+1
Browse[3]> x
[1] 2
Browse[3]> 

那么x就会像预期的那样增加。

为什么?我对调试模式的理解是,您可以运行任何命令,它将被执行,就像运行函数一样,但是上面的if语句似乎并非如此。

我在这里错过了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-27 18:20:26

if条件分两个步骤工作:

计算condition

  • execute语句

以这种方式想象发生的事情也许更容易:

代码语言:javascript
运行
复制
testf <- function(x)
{
  browser()
  if(x==1) {
    x=x+1
  }
  return(x)
}
票数 2
EN

Stack Overflow用户

发布于 2022-01-27 19:45:34

我将根据沃尔迪以上的回答,对我的问题提供一个更详细的答案。我问题的真正核心是:为什么我的if语句在正常模式和调试模式下表现不同?

代码语言:javascript
运行
复制
> x=1
> if(x==1) x=x+1
> x
[1] 2
代码语言:javascript
运行
复制
> 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

  • Execute命令的
  1. .

通常情况下,这些都是同时执行的。但是,调试器将它们分开。这大概是因为错误可能出现在评估步骤或执行步骤中。这是合理的,但其副作用是,如果我在调试模式的命令行中运行 if ,它只执行第一部分(求值),而不执行第二部分(执行)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70883544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档