如何在函数返回输出结束时向用户显示消息?

时间:2015-01-24 04:36:54

标签: r

我正在创建一个导入.txt文件并返回data.frame的函数。有时我想向用户显示一条消息以跟随数据。我的问题是,通过在函数体中包含消息,它显示在数据之前,并且在具有许多行的大data.frame中,用户可能永远不会看到它。

例如,给定:

foo=function(cars){
  message('Pay attention to me!')
  return(cars)
}

如果用户输入:

foo(cars)

该函数将显示我的消息,但仅在返回的对象之前(在这种情况下是来自R的cars包的数据base。如何在底部显示我的message()内容返回的data.frame

我也尝试过回复邮件,但无济于事:

foo=function(cars){
  return(cars,message('help!'))
}

我注意到warning()stop()函数都在data.frame的末尾显示了它们的文本,但是我想要显示既不是警告也不是错误的消息,但只是一个FYI。

为了澄清,理想情况下,在调用函数时将显示消息(无论输出是否分配给变量名),但每次使用结果对象时都不会显示该消息。 foo(cars)应该显示消息,obj=foo(cars)应该显示消息。但只是obj不应该。

2 个答案:

答案 0 :(得分:2)

由于Andrie对a similar question of mine的回答并不完全适用于数据框(它返回一个空框架),我已经对print.bar()进行了一次小调整。似乎适用于数据框架(至少到目前为止)。

foo <- function(x) {
    ## put all your function code here - 'x' will be the return value
    class(x) <- c("bar", class(x))
    x
}

print.bar <- function(x, message = TRUE, ...) {
    ## the only difference is the absence of this line
    NextMethod(x)
    if(message) message("I am a message, hear me ROAR!!")
}

tail(foo(mtcars))
#                 mpg cyl  disp  hp drat    wt qsec vs am gear carb
# Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.7  0  1    5    2
# Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.9  1  1    5    2
# Ford Pantera L 15.8   8 351.0 264 4.22 3.170 14.5  0  1    5    4
# Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.5  0  1    5    6
# Maserati Bora  15.0   8 301.0 335 3.54 3.570 14.6  0  1    5    8
# Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.6  1  1    4    2
# I am a message, hear me ROAR!!

在此编辑中,我在下面的注释中难以实现请求(在分配完成后,在对象下没有消息打印,然后调用对象)。一种可能的解决方法是在分配

时使用suppressMessages()
obj <- suppressMessages(foo(mtcars))

因此,当在控制台中呼叫时,foo()将打印该消息。分配obj时,后续打印obj

时将无法打印消息

答案 1 :(得分:2)

这不是一个直接的答案,但我认为,如果对用户来说重要的是看到消息,或许警告是适当的。或者,您可以暂停显示以使用户有机会在固定的时间内阅读该消息:

foo=function(cars){
  message("pay attention to me!")
  Sys.sleep(2)
  return(cars)
}

或直到用户确认:

foo=function(cars){
  x <- readline("pay attention to me!\n(press enter to continue)")
  return(cars)
}