我正在创建一个导入.txt
文件并返回data.frame
的函数。有时我想向用户显示一条消息以配合数据。我的问题是,通过将消息包含在函数的主体中,它显示在数据之前,并且在具有许多行的大data.frame
中,用户可能永远不会看到它。
例如,给定:
foo=function(cars){
message('Pay attention to me!')
return(cars)
}
如果用户输入:
foo(cars)
该函数将显示我的消息,但仅在返回的对象(在本例中为从 R 的 base
包中cars
数据)之前。如何在返回data.frame
的底部显示我的message()
内容?
我也尝试返回消息,但无济于事:
foo=function(cars){
return(cars,message('help!'))
}
我注意到 warning()
和 stop()
函数都在data.frame
末尾显示其文本,但我想显示一条既不是警告也不是错误的消息,而只是仅供参考。
为了澄清,理想情况下,调用函数时将显示消息(无论输出是否分配给变量名称),但每次使用结果对象时都不会显示该消息。 foo(cars)
应显示消息,obj=foo(cars)
也应显示该消息。但只是obj
不应该。
这不是一个直接的答案,但我认为,如果用户看到消息很重要,也许警告毕竟是合适的。或者,您可以暂停显示,让用户有机会阅读消息,时间固定
: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)
}
由于 Andrie 对我的类似问题的回答并不完全适用于数据帧(它返回了一个空帧),因此我对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