>>>>> "PD" == Peter Dalgaard <[EMAIL PROTECTED]> >>>>> on Fri, 16 Mar 2007 08:09:00 +0100 writes:
PD> Seth Falcon wrote: >> [EMAIL PROTECTED] writes: >> >>> Investigating this new implementation I come across an issue in >>> conjuntion with using S4 classes and methods. try(expr) does not return an >>> object with attribute 'try-error' in case of method dispatch failure >>> in the wrapped expression which to me seems not >>> quite correct. >>> >> >> We've seen some similar issues but had not had time to track them >> down. >> >> >>> Examples to reproduce the observation: >>> >> >> It isn't S4 specific. The issue seems more about anonymous >> calls/functions. >> >> ll = list() >> ll[[1]] = function(x) stop("died") >> >> v = try(do.call(ll[[1]], list(1)), silent=TRUE) >> Error in as.list(call)[[1]] == "doTryCatch" : >> comparison (1) is possible only for atomic and list types >> > v >> Error: object "v" not found >> >> I don't fully understand why the call is being computed, but the >> following seems to get things going. >> >> + seth >> >> --- a/src/library/base/R/New-Internal.R >> +++ b/src/library/base/R/New-Internal.R >> @@ -7,7 +7,8 @@ try <- function(expr, silent = FALSE) { >> ## Patch up the call to produce nicer result for testing as >> ## try(stop(...)). This will need adjusting if the >> ## implementation of tryCatch changes. >> - if (as.list(call)[[1]] == "doTryCatch") >> + callFun <- as.list(call)[[1]] >> + if (is.name(callFun) && callFun == "doTryCatch") >> call <- sys.call(-4) >> dcall <- deparse(call)[1] >> prefix <- paste("Error in", dcall, ": ") >> >> PD> Good catch, Seth. yes, indeed! PD> The code still looks a bit clunky though, and I wonder PD> if this wouldn't be nicer: PD> if (identical(call[[1]], quote(doTryCatch))) call <- sys.call(-4) PD> I.e., the thing that is clearly wrong is the use of "==" on something PD> that is not necessarily a simple name, but the use of as.list seems PD> unnecessary and comparisons between strings and names is a bit awkward too. Indeed, I had similar thoughts when reading the part of code Seth was patching { but would have used the old-fashioned as.name("doTryCatch") instead of the modern quote(doTryCatch) for the only reason that I'm probably slightly ``older fashioned'' than Peter ;-) } Martin ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel