使用Rstudio的traceback()的行为不稳定:每次都有不同的输出

时间:2019-04-04 21:30:46

标签: r rstudio traceback

我使用RStudio;我有script1用source导入script2; script2中的函数会导致错误。第一次发生时,Rstudio告诉我x行的脚本1导致y行的script2错误。如果我重新运行它,它只会告诉我有关script2中的错误。为什么?这会使调试变得更加痛苦。

更多详细信息:

我有一个myfun.R文件,其中包含此功能(当然,这只是一个玩具示例):

sum_2_nums <- function(x,y) {
  out <- x + y
  return(out)
}

然后我使用source将函数导入另一个文件:

source("myfun.R")
mysum <- sum_2_nums(3,"hello")

RStudio设置为debug -> on error -> error inspector。当我运行上面的代码时,我看到:

enter image description here

这告诉我myfun.R,第12行中的错误是由try_traceback.R,第13行引起的。

但是,如果我再次运行该脚本,则会得到:

enter image description here

即该错误不再追溯到try_traceback.R。我需要在控制台中输入traceback()才能看到。为什么?第二次的不同行为确实使我感到困惑。这使调试不必要地痛苦了!有办法避免吗?

请注意此问题不是this 的重复:它们看起来很相似,但是使用echo=TRUE或{{ 1}}不能解决我关于将错误跟踪到第一个.R文件的问题。

我看到了相同的问题here,但仍未得到答案。

编辑

为了澄清,请回答一些评论:

    就像我说的那样,
  • ,如果我单击Debug-> Error上的>-我看到“错误检查器”被勾选。

  • 如果我在控制台中键入verbose=TRUE,则屏幕上什么也没有发生,但是“错误检查器”被取消选择了

  • 我的代码中没有其他内容。这是一个玩具示例,仅显示了我所显示的线条,而没有其他内容。我不知道还有什么可以澄清的-任何指导将不胜感激。

  • 我对R并不陌生。我使用Python进行数据分析,但对R感到好奇。我听说R的调试麻烦得多,并且想自己尝试一下。假设即使只追溯这样的常规错误也是有问题的,我也不会花很多时间学习R,所以我想了解我是否做错了什么,或者调试和追溯总是在R

  • 当我说“运行”时,是指我单击RStudio中的“源”按钮(“运行”旁边的按钮

  • sessionInfo()显示:

options(error=function()traceback(1))

编辑#2 (以回复duckmayr的回答)

让我们退后一步。在Python中,我习惯于始终看到发生错误时称为什么的相当详细的追溯。例如。当我看到这样的内容时,会发现它非常有用:

enter image description here

我发布的R studio的第一个屏幕截图非常相似,并且同样有用。 因此,我的预期输出是每次发生错误时都获得完整的追溯。

为什么?因为那对我最有帮助;每次不显示它的好处可能是什么?我不明白。

您是在说不是每次设计都没有列出完整的回溯吗?如果是这样:

  • 为什么?是否有我想念的根本原因?是否有任何情况比我以前使用Python更有意义?
  • 此文件记录在任何地方吗?我找不到。
  • 是否有办法每次都获得完整的追溯?要更改设置吗?退出并重新打开RStudio可以吗?

是的,我知道我总是可以键入traceback(),但是Python每次都显示完整回溯的行为要方便得多-我真的看不到仅在第一次显示回溯会有什么好处。

1 个答案:

答案 0 :(得分:1)

我发现准确地了解您想要RStudio赋予您的行为有些困难,但是如果我发布一些有关期望的信息可能会有所帮助。

  • 并非每次都列出完整的追溯:根据我的经验,RStudio仅在第一次以其当前形式执行函数时自动打印完整的追溯。如果更改代码,则下一个调用也应自动打印完整的回溯。此行为可能会或可能不会自动配置。 但是,更重要的是
  • R功能traceback()debug()始终可用,无论RStudio的设置如何!因此,我第一次source您的脚本时,我会看到:

enter image description here

然后,如果我source没有任何其他更改的脚本,我得到:

> source('~/try_traceback.R')
Error in x + y : non-numeric argument to binary operator

但是,这没问题;我可以跑步:

> traceback()
5: sum_2_nums(3, "hello") at try_traceback.R#2
4: eval(ei, envir)
3: eval(ei, envir)
2: withVisible(eval(ei, envir))
1: source("~/try_traceback.R")

我还可以使用debug(sum_2_nums)通过调试重新运行该功能。

此外,如果我将sum_2_nums()中的myfun.R更改为以下内容:

sum_2_nums <- function(x,y) {
    cat("")
    out <- x + y
    return(out)
}

我再次看到

enter image description here

当我尝试source您的脚本时。

所以您可能会不同意,但是我发现在R中调试并不困难,只需记住函数traceback()debug(),您会没事的。