这是昨天问到Convert a message to a character vector的后续问题。我正在开发一个函数,它将函数调用中输出的消息(如果有的话)作为字符向量返回。我想通用,因为在以下函数中,FUN
是一个函数,arg
或arg1
是第一个参数,...
是进一步的论点。第一个功能运作良好。
getMessage <- function(FUN, arg)
{
FUN <- deparse(substitute(FUN))
tc <- textConnection("messages", "w")
on.exit(close(tc))
sink(tc, type = "message")
eval(call(FUN, arg))
sink(NULL, type = "message")
messages
}
getMessage(scan, "data.txt")
# [1] "Read 15 items"
但是当我添加...
时,为了能够将其推广到其他函数调用,我没有输出,"messages"
连接仍保持打开状态。
getMessage <- function(FUN, arg1, ...)
{
FUN <- deparse(substitute(FUN))
tc <- textConnection("messages", "w")
on.exit(close(tc))
sink(tc, type = "message")
eval(call(FUN, arg1, ...))
sink(NULL, type = "message")
messages
}
> getMessage(scan, "data.txt")
> showConnections()
# description class mode text isopen can read can write
# 3 "messages" "textConnection" "w" "text" "opened" "no" "yes"
...
仍然可以在函数中使用吗? sink
还有一些我可能希望在某些时候使用的论点。
编辑
可以使用以下代码
创建文件"data.txt"
> m <- matrix(c(13, 14, 4950, 20, 50, 4949, 22, 98, 4948, 30, 58, 4947, 43, 48, 4946),
5, byrow = TRUE)
> write.table(m, "data.txt", row.names = F, col.names = F)
答案 0 :(得分:3)
call
失败,因为您无法以此方式使用...
此功能。如果您关闭接收器,您将看到错误消息。您希望将eval
的电话打包到tryCatch
并打印错误,如果遇到错误,而不是eval
+ call
,使用do.call
。
getMessage <- function(FUN, ...)
{
FUN <- deparse(substitute(FUN))
tc <- textConnection("messages", "w")
on.exit(close(tc))
sink(tc, type = "message")
tryCatch(do.call(FUN, list(...)), error=function(e) {message(e$message)})
sink(NULL, type = "message")
messages
}
getMessage(scan, "data.txt")