tryCatch 和 ggplot [英] tryCatch and ggplot
问题描述
我经常使用 tryCatch
来捕获 R 代码中的潜在错误消息,但是今天我在使用 ggplot
时遇到了一个奇怪的问题 - 我真的不知道发生了什么(即使在 Google/SO 搜索上花费了一些时间).
I use tryCatch
a lot to capture potential error messages in my R code, but I faced a strange issue today with ggplot
- and I really do not have any idea what is going on (even after some time spent on Google/SO searching).
具有不完整 ggplot
调用的简单示例(未添加层):
Simple example with an incomplete ggplot
call (no added layer):
> tryCatch(eval(parse(text = 'ggplot(mtcars, aes(x=hp, y=wt))')), error = function(e) e)
Error: No layers in plot
所以错误没有被捕获.甚至更多:我得到一个带有 ggplot
类的 R 对象:
So the error is not captured. Even more: I get an R object with ggplot
class:
> str(tryCatch(eval(parse(text = 'ggplot(mtcars, aes(x=hp, y=wt))')), error = function(e) e))
List of 8
$ data :'data.frame': 32 obs. of 11 variables:
..$ mpg : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
..$ cyl : num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
..$ disp: num [1:32] 160 160 108 258 360 ...
..$ hp : num [1:32] 110 110 93 110 175 105 245 62 95 123 ...
..$ drat: num [1:32] 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
..$ wt : num [1:32] 2.62 2.88 2.32 3.21 3.44 ...
..$ qsec: num [1:32] 16.5 17 18.6 19.4 17 ...
..$ vs : num [1:32] 0 0 1 1 0 1 0 1 1 1 ...
..$ am : num [1:32] 1 1 1 0 0 0 0 0 0 0 ...
..$ gear: num [1:32] 4 4 4 3 3 3 3 4 4 4 ...
..$ carb: num [1:32] 4 4 1 1 2 1 4 2 2 4 ...
$ layers : list()
$ scales :Reference class 'Scales' [package "ggplot2"] with 1 fields
..$ scales: NULL
..and 20 methods, of which 9 are possibly relevant:
.. add, clone, find, get_scales, has_scale, initialize, input, n,
.. non_position_scales
$ mapping :List of 2
..$ x: symbol hp
..$ y: symbol wt
$ options :List of 1
..$ labels:List of 2
.. ..$ x: chr "hp"
.. ..$ y: chr "wt"
$ coordinates:List of 1
..$ limits:List of 2
.. ..$ x: NULL
.. ..$ y: NULL
..- attr(*, "class")= chr [1:2] "cartesian" "coord"
$ facet :List of 1
..$ shrink: logi TRUE
..- attr(*, "class")= chr [1:2] "null" "facet"
$ plot_env :<environment: R_GlobalEnv>
- attr(*, "class")= chr "ggplot"
有什么想法可以捕获此类错误吗?
Any ideas to capture these kind of errors?
更新:我知道上述调用在某些情况下可能没问题(例如稍后添加图层).但是请考虑以下示例(请注意,我们在那里有一个错字:在 y
轴上提供了 t
而不是 wt
):
Update: I am aware of the fact that the above call might be OK in some situations (like adding a layer later). But then please consider the following example (please note that we have a typo there: t
is provided on y
axis instead of wt
):
> tryCatch(eval(parse(text = 'ggplot(mtcars, aes(x=hp, y=t)) + geom_point()')), error = function(e) e)
Error in data.frame(x = c(110, 110, 93, 110, 175, 105, 245, 62, 95, 123, :
arguments imply differing number of rows: 32, 0
我确实收到了错误消息,但 tryCatch
没有捕获到.
I do get the error message, but that's not captured by tryCatch
.
推荐答案
出现这种情况是因为错误不是在调用 ggplot
时发生,而是在调用 print.ggplot 时发生代码>.
This happens because the error doesn't occur in the call to ggplot
, but in the call to print.ggplot
.
所以您的 tryCatch
工作正常,但错误仅在稍后尝试打印时发生.这意味着您必须将 tryCatch
放在 print
语句周围:
So your tryCatch
works, but the error occurs only later, when trying to print. This means you have to put the tryCatch
around the print
statement:
试试这个:
x <- tryCatch(eval(parse(text = 'ggplot(mtcars, aes(x=hp, y=wt))')),
error = function(e) e)
tryCatch(print(x), error = function(e) e)
<simpleError: No layers in plot>
<小时>
对于你的第二个例子:
And for your second example:
x <- eval(parse(text = 'ggplot(mtcars, aes(x=hp, y=t)) + geom_point()'))
tryCatch(print(x), error = function(e) e)
<simpleError in data.frame(x = c(110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215, 230, 66, 52, 65, 97, 150, 150, 245, 175, 66, 91, 113, 264, 175, 335, 109), y = structure(function (x) standardGeneric("t"), generic = structure("t", package = "base"), package = "base", group = list(), valueClass = character(0), signature = "x", default = structure(function (x) UseMethod("t"), target = structure("ANY", class = structure("signature", package = "methods"), .Names = "x", package = "methods"), defined = structure("ANY", class = structure("signature", package = "methods"), .Names = "x", package = "methods"), generic = structure("t", package = "base"), class = structure("derivedDefaultMethod", package = "methods")), skeleton = structure(function (x) UseMethod("t"), target = structure("ANY", class = structure("signature", package = "methods"), .Names = "x", package = "methods"), defined = structure("ANY", class = structure("signature", package = "methods"), .Names = "x", package = "methods"), generic = structure("t", package = "base"), class = structure("derivedDefaultMethod", package = "methods"))(x), class = structure("standardGeneric", package = "methods")), PANEL = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), check.names = FALSE, stringsAsFactors = TRUE): arguments imply differing number of rows: 32, 0>
这篇关于tryCatch 和 ggplot的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!