tryCatch 和 ggplot [英] tryCatch and ggplot

查看:42
本文介绍了tryCatch 和 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆