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

问题描述 投票:8回答:1

我用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=TRUEverbose=TRUE给出的答案并没有解决我将错误跟踪到第一个.R文件的观点。

我看到同样的问题here,但它仍然没有答案。

编辑

澄清一下,回答一些评论:

  • 就像我说的,如果我点击Debug - > on Error - >我看到“错误检查器”被勾选了。
  • 如果我在控制台中键入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

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

我们可以退一步吧。在Python中,我习惯于总是看到一个相当详细的回溯,当有错误时会调用什么。例如。当我看到这样的东西时,我发现它非常有帮助:

enter image description here

我发布的R studio的第一个截图非常相似,同样有帮助。所以我的预期输出是每次发生错误时获得完整的回溯。

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

您是否反过来说,每次都没有列出完整的追溯?如果是这样:

  • 为什么?我错过了一个根本原因吗?有没有比我习惯使用Python更有意义的场景?
  • 这记录在哪里?我找不到它。
  • 有没有办法每次都获得完整的追溯?要改变的设定?会退出并重新开放RStudio吗?

是的,我知道我总是可以键入traceback(),但Python每次显示完整回溯的行为都更方便 - 我真的没有看到第一次显示回溯的优点是什么。

r rstudio traceback
1个回答
1
投票

我觉得很难准确地得到你希望RStudio给你的行为,但如果我发布一些关于预期的信息,它可能对你有所帮助。

  • 每次都没有列出完整的回溯:根据我的经验,RStudio仅在第一次以当前形式执行函数时自动打印完整的回溯。如果您更改了代码,那么下一次调用也应该自动打印完整的回溯。此行为可能是也可能不是可自动配置的。但是,更重要的是:
  • 无论RStudio的设置如何,R函数traceback()debug()始终可供您使用!所以,我第一次在你的剧本中使用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(),你就没事了。

© www.soinside.com 2019 - 2024. All rights reserved.