[Rd] [R] incoherent conversions from/to raw

Martin Maechler maechler at stat.math.ethz.ch
Tue Mar 31 12:05:37 CEST 2009


>>>>> "WK" == Wacek Kusnierczyk <Waclaw.Marcin.Kusnierczyk at idi.ntnu.no>
>>>>>     on Thu, 19 Mar 2009 10:17:20 +0100 writes:

    WK> Wacek Kusnierczyk wrote:
    >> interestingly,
    >> 
    >> c(1, as.raw(1))
    >> # error: type 'raw' is unimplemented in 'RealAnswer'
    >> 
    >> 

    WK> three more comments.


    WK> (1)
    WK> the above is interesting in the light of what ?c says:

    WK> "
    WK> The output type is determined from the highest type of the
    WK> components in the hierarchy NULL < raw < logical < integer < real
    WK> < complex < character < list < expression.
    WK> "

    WK> which seems to suggest that raw components should be coerced to whatever
    WK> the highest type among all arguments to c, which clearly doesn't happen:

    WK> test = function(type)
    WK> c(as.raw(1), get(sprintf('as.%s',type))(1))

    WK> for (type in c('null', 'logical', 'integer', 'real', 'complex',
    WK> 'character', 'list', 'expression'))
    WK> tryCatch(test(type), error = function(e) cat(sprintf("raw won't
    WK> coerce to %s type\n", type)))

    WK> which shows that raw won't coerce to the four first types in the
    WK> 'hierarchy' (excluding NULL), but it will to character, list, and
    WK> expression.

    WK> suggestion:   improve the documentation, or adapt the implementation to
    WK> a more coherent design.

Thank you, Wacek.

I've decided to adapt the implementation
such that all the above  c(<raw> , <type>)  calls' implicit
coercions will work.


    WK> (2)
    WK> incidentally, there's a bug somewhere there related to the condition
    WK> system and printing:

    WK> tryCatch(stop(), error=function(e) print(e))
    WK> # works just fine

    WK> tryCatch(stop(), error=function(e) sprintf('%s', e))
    WK> # *** caught segfault ***
    WK> # address (nil), cause 'memory not mapped'

    WK> # Traceback:
    WK> # 1: sprintf("%s", e)
    WK> # 2: value[[3]](cond)
    WK> # 3: tryCatchOne(expr, names, parentenv, handlers[[1]])
    WK> # 4: tryCatchList(expr, classes, parentenv, handlers)
    WK> # 5: tryCatch(stop(), error = function(e) sprintf("%s", e))

    WK> # Possible actions:
    WK> # 1: abort (with core dump, if enabled)
    WK> # 2: normal R exit
    WK> # 3: exit R without saving workspace
    WK> # 4: exit R saving workspace
    WK> # Selection:
 
    WK> interestingly, it is possible to stay in the session by typing ^C.  the
    WK> session seems to work, but if the tryCatch above is tried once again, a
    WK> segfault causes r to crash immediately:

    WK> # ^C
    WK> tryCatch(stop(), error=function(e) sprintf('%s', e))
    WK> # [whoever at wherever] $

    WK> however, this doesn't happen if some other code is evaluated first:

    WK> # ^C
    WK> x = 1:10^8
    WK> tryCatch(stop(), error=function(e) sprintf('%s', e))
    WK> # Error in sprintf("%s", e) : 'getEncChar' must be called on a CHARSXP
  
    WK> this can't be a feature.  (tried in both 2.8.0 and r-devel;  version
    WK> info at the bottom.)

    WK> suggestion:  trace down and fix the bug.

[not me, at least not now.]


    WK> (3)
    WK> the error argument to tryCatch is used in two examples in ?tryCatch, but
    WK> it is not explained anywhere in the help page.  one can guess that the
    WK> argument name corresponds to the class of conditions the handler will
    WK> handle, but it would be helpful to have this stated explicitly.  the
    WK> help page simply says:

    WK> "
    WK> If a condition is signaled while evaluating 'expr' then
    WK> established handlers are checked, starting with the most recently
    WK> established ones, for one matching the class of the condition.
    WK> When several handlers are supplied in a single 'tryCatch' then the
    WK> first one is considered more recent than the second. 
    WK> "

    WK> which is uninformative in this respect -- what does 'one matching the
    WK> class' mean?

    WK> suggestion:  improve the documentation.

Patches to  tryCatch.Rd  are gladly accepted
and quite possibly applied to the sources without much changes.
Thanks in advance!

Martin Maechler, ETH Zurich



More information about the R-devel mailing list