Skip to content

capture error messages from loading shared objects

6 messages · Adrian Dusa, Ivan Krylov, Bill Dunlap +1 more

#
Fellow R developers,

I can capture usual error message using the normal way:
<simpleError: object 'a' not found>

However I have troubles capturing the error message from this type of error:
Loading required namespace: foobar
Failed with error:  ?there is no package called ?foobar??
[1] FALSE

Is there any way to capture that specific error message?

Thank you in advance,
Adrian
#
? Tue, 28 Nov 2023 10:46:45 +0100
Adrian Dusa <dusa.adrian at unibuc.ro> ?????:
I think you meant loadNamespace() (which throws errors), not
requireNamespace() (which internally uses tryCatch(loadNamespace(...))
and may or may not print the error depending on the `quietly` argument).
#
Once again, Ivan, many thanks.
Yes, that does solve it.
Best wishes,
Adrian
On Tue, Nov 28, 2023 at 11:28?AM Ivan Krylov <krylov.r00t at gmail.com> wrote:

            

  
  
#
If you would like to save the error message instead of suppressing it, you
can use tryCatch(message=function(e)e, ...).

-BIll
On Tue, Nov 28, 2023 at 3:55?AM Adrian Dusa <dusa.adrian at unibuc.ro> wrote:

            

  
  
#
Careful; tryCatch() on non-error conditions will break out of what's
evaluated, e.g.

res <- tryCatch({
  cat("1\n")
  message("2")
  cat("3\n")
  42
}, message = identity)

will output '1' but not '3', because it returns as soon as the first
message() is called.

To "record" messages (same for warnings), use withCallingHandlers()
instead, e.g.

msgs <- list()
res <- withCallingHandlers({
  cat("1\n")
  message("2")
  cat("3\n")
  42
}, message = function(m) {
  msgs <<- c(msgs, list(m))
  invokeRestart("muffleMessage")
})

This will output '1', muffle '2', output '3', and return 42, and 'msgs' holds
[[1]]
<simpleMessage in message("2"): 2

/Henrik
On Tue, Nov 28, 2023 at 10:34?AM Bill Dunlap <williamwdunlap at gmail.com> wrote:
#
Thanks Henrik and Bill,

Indeed, but I do have a function called tryCatchWEM() in package admisc
that captures all that.

My use case was to test for different architectures (for instance, arm64 vs
Intel MacOS) embedding R in cross-platform applications.
I needed to test if the package could be loaded, and previously used
requireNamespace() being unaware, as Ivan pointed out, that internally that
function already does tryCatch() with loadNamespace().

That was the reason why my own function tryCatchWEM() could not capture
that specific error message.
I now do:
$error
[1] "there is no package called ?foobar?"

(and the error message is captured just fine).

All the best,
Adrian

On Tue, Nov 28, 2023 at 7:45?PM Henrik Bengtsson <henrik.bengtsson at gmail.com>
wrote: