麻烦使用`...`连接

时间:2014-06-25 16:56:22

标签: r

这是昨天问到Convert a message to a character vector的后续问题。我正在开发一个函数,它将函数调用中输出的消息(如果有的话)作为字符向量返回。我想通用,因为在以下函数中,FUN是一个函数,argarg1是第一个参数,...是进一步的论点。第一个功能运作良好。

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)

1 个答案:

答案 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")