我用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
。当我运行上面的代码时,我看到:
这告诉我myfun.R中的错误,第12行是由try_traceback.R,第13行引起的。很棒。
但是,如果我再次运行脚本,我会得到:
即错误不再追溯到try_traceback.R
。我需要在控制台中键入traceback()
才能看到。为什么?第二次不同的行为让我感到很困惑。这使得调试不必要地比它需要的更痛苦!有没有办法避免它?
注意这个问题不是this的重复:它们可能看起来很相似,但是使用echo=TRUE
或verbose=TRUE
给出的答案并没有解决我将错误跟踪到第一个.R文件的观点。
我看到同样的问题here,但它仍然没有答案。
澄清一下,回答一些评论:
options(error=function()traceback(1))
,屏幕上没有任何反应,但“错误检查器”将被取消选中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
我们可以退一步吧。在Python中,我习惯于总是看到一个相当详细的回溯,当有错误时会调用什么。例如。当我看到这样的东西时,我发现它非常有帮助:
我发布的R studio的第一个截图非常相似,同样有帮助。所以我的预期输出是每次发生错误时获得完整的回溯。
为什么?因为那对我最有帮助;什么可能是每次不显示它的优点?我不明白。
您是否反过来说,每次都没有列出完整的追溯?如果是这样:
是的,我知道我总是可以键入traceback(),但Python每次显示完整回溯的行为都更方便 - 我真的没有看到第一次显示回溯的优点是什么。
我觉得很难准确地得到你希望RStudio给你的行为,但如果我发布一些关于预期的信息,它可能对你有所帮助。
traceback()
和debug()
始终可供您使用!所以,我第一次在你的剧本中使用source
时,我看到:然后如果我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)
}
我再次看到
当我尝试source
你的脚本。
所以你可能不同意,但我发现R中的调试并不困难,只记得函数traceback()
和debug()
,你就没事了。