当存在多行的调用时,潜在的错误只包括match.call()的第一行,导致一些丢失的信息和一个不完整的句子。一个简单的例子:
#proper error message:
runif(n=1, k=5)
#incomplete error message:
runif(n=1, k={5})
什么方法可以让R包含对错误消息的完整调用(可能通过折叠多行等)?我最感兴趣的是在tryCatch设置中使用它。
答案 0 :(得分:3)
我通过以下方式调查tryCatch
设置中的错误对象:
tryCatch( runif(n=1,k={5}),
error = function(e) recover() )
然后选择第4个环境(value[[3]](cond)
)来检查e
。
我注意到e$call
是:
Browse[1]> e$call
runif(n = 1, k = {
5
})
所以似乎错误消息只使用了第一行。
您可以使用以下方式折叠所有行:
Browse[1]> paste(deparse(e$call),collapse='')
[1] "runif(n = 1, k = { 5})"
所以你可以尝试类似的东西:
tryCatch( runif(n=1,k={5}),
error = function(e) {
cat(sprintf('Error in %s: %s\n',
paste(deparse(e$call),collapse=''),
e$message))
} )
但这并没有解决错误信息本身,只是导致它的通话:
runif出错(n = 1,k = {5}):未使用的参数(k = {
所以'xxx中的错误'已经完成,但'未使用的参数xxx'仍未完成。这是一个开始,但不是一直都在那里。
我不确定如何改进(并且我也有兴趣知道它是否可行)。