r - 使用 Rstudio 的 traceback() 行为异常:每次输出不同
问题描述
我使用 RStudio;我有 script1 导入 script2 source
;script2 中的函数导致错误。第一次发生时,Rstudio 告诉我第 x 行的脚本 1 导致第 y 行的脚本 2 出错。如果我重新运行它,它只会告诉我 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()
在控制台中输入才能看到。为什么?第二次不同的行为真的让我很困惑。这使得调试不必要地比它需要的更痛苦!有没有办法避免它?
请注意,此问题不是此问题的重复:它们可能看起来相似,但那里给出的答案使用echo=TRUE
或verbose=TRUE
没有解决我关于将错误跟踪到第一个 .R 文件的观点。
我在这里看到了同样的问题,但仍然没有答案。
编辑
为了澄清,在回答一些评论:
就像我说的,如果我点击 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 中,我习惯于在出现错误时总是看到一个相当详细的回溯。例如,当我看到这样的东西时,我发现它很有帮助:
我发布的 R studio 的第一个屏幕截图非常相似,并且同样很有帮助。所以我的预期输出是每次发生错误时都获得完整的回溯。
为什么?因为那对我最有帮助;不每次都显示它可能有什么好处?我不明白。
您是不是说每次都没有列出完整的回溯是设计使然?如果是这样:
- 为什么?我失踪有根本原因吗?有没有什么场景比我习惯的 Python 更有意义?
- 这在任何地方都有记录吗?我找不到它。
- 有没有办法每次都获得完整的回溯?要更改的设置?退出并重新打开 RStudio 可以吗?
是的,我知道我总是可以键入 traceback(),但是 Python 每次显示完整回溯的行为要方便得多——我真的看不出只第一次显示回溯的好处是什么。
解决方案
我发现很难准确地获得您希望 RStudio 给您的行为,但是如果我发布一些有关预期内容的信息,它可能会对您有所帮助。
- 并非每次都列出完整的回溯:根据我的经验,RStudio 仅在第一次以当前形式执行函数时自动打印完整的回溯。如果您更改代码,那么下一次调用也应该自动打印完整的回溯。此行为可能会或可能不会自动配置。然而,更重要的是:
traceback()
无论 RStudio 的设置如何,R 功能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()
你就会没事的。
推荐阅读
- c++ - 读取堆栈分配数组的越界会导致现实世界中的任何问题吗?
- wordpress - 如何使用 loco translate 插件更改 wordpress 网站的默认语言?
- python - 如何从 .txt 文件中导入数据。并训练这些数据?
- nestjs - Nestjs 拦截器是否仅适用于 @Get?
- react-native - 没有通过频道 ID,通知可能不起作用。反应原生推送通知
- reactjs - 如何在 react-hook-from 中使用 material-ui 自动完成功能
- android - 如何在自定义应用程序中以编程方式清除 Android 8.1.0 中的蓝牙存储缓存?
- html - 如何在向下滚动几个像素时显示框阴影?
- python - 在非英语字符串中查找子字符串 [乌尔都语字符串]
- django - 在 django 服务器启动后运行一个函数