2012-08-02 17 views
6

Ich benutze tryCatch eine Menge, um mögliche Fehlermeldungen in meinem R-Code zu erfassen, aber ich konfrontiert heute ein seltsames Problem mit ggplot - und ich habe wirklich keine Ahnung, was los ist (auch nach einiger Zeit auf Google/SO-Suche).tryCatch und ggplot

Einfaches Beispiel mit einem unvollständigen ggplot Anruf (ohne Zusatz-Schicht):

> tryCatch(eval(parse(text = 'ggplot(mtcars, aes(x=hp, y=wt))')), error = function(e) e) 
Error: No layers in plot 

So ist der Fehler nicht erfaßt wird. Mehr noch: Ich erhalte ein R-Objekt mit ggplot Klasse:

> 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" 

Irgendwelche Ideen, diese Art von Fehlern zu erfassen?


aktualisieren: Ich bin die Tatsache bewusst, dass der oben genannte Aufruf in einigen Situationen in Ordnung sein könnte (wie eine Schicht später hinzufügen). Aber dann beachten Sie bitte das folgende Beispiel (bitte beachten Sie, dass wir einen Tippfehler dort haben: t auf y Achse vorgesehen ist, statt 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 

ich die Fehlermeldung, aber das ist nicht von tryCatch erfasst.

Antwort

8

Dies geschieht, weil der Fehler nicht in dem Aufruf ggplot, sondern in dem Aufruf print.ggplot auftritt.

So funktioniert Ihre tryCatch, aber der Fehler tritt erst später, wenn Sie versuchen zu drucken. Das heißt, Sie haben die tryCatch um die print Anweisung zu setzen:

diesen Versuchen Sie stattdessen:

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> 

Und für Ihr zweites Beispiel:

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> 
+1

Super, vielen Dank! Wie konnte ich das verpassen? :) Es war ziemlich offensichtlich nach einem Blick auf Ihre erste Zeile, aber diese Frage gab mir ein paar Stunden Kopfschmerzen davor. Also kurz: Nochmals vielen Dank :) – daroczig

+0

Ich bin froh, dass ich helfen konnte! Manchmal kann man einfach zu nah am Code sein ... – Andrie

Verwandte Themen