在显示消息之后,删除循环或lapply语句中的消息



我的问题相当基本,尽管我已经做了一些搜索,但找不到解决方案。

我在大型数据集上运行lapply和自定义函数,并喜欢嵌入message语句,这样我就可以知道在任何给定的时间点我在流程中走了多远。我注意到,在某些函数中,R将提供一条带有进度的消息,然后删除该消息,以只包含给定的时间快照(即R以%表示进度,比如13%,然后删除进度,以只说明给定时刻的进度,比如15%,而不必看到13%曾经存在(。

如何在lapply函数或loop中删除消息?下面是一个小数据集的示例,我在其中显示一条消息,我希望在打印下一条消息时删除该消息。

iris_numcols <- iris %>% select(where(is.numeric)) %>% colnames()
lapply(iris_numcols, function(x){

message(paste0('Calculating mean value of', x))

mean(iris[[x]])

})

输出

Calculating mean value ofSepal.Length
Calculating mean value ofSepal.Width
Calculating mean value ofPetal.Length
Calculating mean value ofPetal.Width

看看txtProgressBar()是如何实现这一点的,您可以将cat()"r"特殊字符(回车(结合使用,返回控制台中当前行的开头并覆盖它。但是,您不能以这种方式更改当前行以上的任何内容。

iris_numcols <- iris %>% select(where(is.numeric)) %>% colnames()
lapply(iris_numcols, function(x) {

cat(paste('rCalculating mean value of', x))
Sys.sleep(1)

mean(iris[[x]])
})

不过,在某些情况下,这可能会成为问题。引用?txtProgressBar():

使用样式2或3或减小样式=1的值使用\r返回到左边距–回车的解释取决于运行r的终端或控制台,这很可能在终端以外的连接上产生难看的输出,包括stdout((重定向到文件时。

最新更新