使用Rstudio的traceback()的错误行为:每次输出不同

Pyt*_*ous 8 r traceback rstudio

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

更详细:

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

sum_2_nums <- function(x,y) {
  out <- x + y
  return(out)
}
Run Code Online (Sandbox Code Playgroud)

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

source("myfun.R")
mysum <- sum_2_nums(3,"hello")
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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

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

在此处输入图片说明

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

注意这个问题是不是一个重复:他们可能看起来相似,但答案给出了使用的有echo=TRUEverbose=TRUE没有解决对跟踪误差的第一.R文件我的观点。

我在这里看到了相同的问题,但仍未得到解答。

编辑

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

  • 就像我说的,如果我单击“调试”->“错误”->“我看到”“错误检查器”被选中。

  • 如果我options(error=function()traceback(1))在控制台中键入,屏幕上什么也不会发生,但是“错误检查器”被取消选择

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

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

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

  • sessionInfo()显示:

sessionInfo() R version 3.5.3 (2019-03-11) Platform:
x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale: [1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252    

attached base packages: [1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.5.3 tools_3.5.3    yaml_2.2.0
Run Code Online (Sandbox Code Playgroud)

编辑#2(回应duckmayr的答案)

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

在此处输入图片说明

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

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

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

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

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

duc*_*ayr 1

我发现很难准确地了解您希望 RStudio 为您提供什么行为,但如果我发布一些有关预期行为的信息,可能会对您有所帮助。

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

在此输入图像描述

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

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

但是,这没有问题;我可以运行:

> 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")
Run Code Online (Sandbox Code Playgroud)

我还可以使用debug(sum_2_nums)调试来重新运行该函数。

另外,如果我更改sum_2_nums()myfun.R以下内容:

sum_2_nums <- function(x,y) {
    cat("")
    out <- x + y
    return(out)
}
Run Code Online (Sandbox Code Playgroud)

我又看到了

在此输入图像描述

当我尝试source你的脚本时。

所以你可能不同意,但我不认为 R 中的调试很困难,只要记住函数traceback()debug()可以了。