为何read_csv2读取csv文件配合renderPrint时输出会出现异常索引进度条
问题原因
readr::read_csv2()、vroom::vroom()这类快速读取函数默认会在读取过程中输出进度信息到标准错误流,而Shiny的renderPrint()会捕获执行过程中所有的标准输出、标准错误流内容一并渲染,所以就会出现你看到的索引进度条前缀,和返回值是tibble还是data.frame没有关系。
解决方案
- 方法1:调用读取函数时直接关闭进度输出(推荐,针对性最强,不影响其他代码逻辑)
直接在读取函数中添加progress = FALSE参数关闭进度条,同时可以加show_col_types = FALSE关闭列类型提示输出,避免额外信息被捕获:
data <- reactive({ req(input$upload) read_csv2(input$upload$datapath, progress = FALSE, show_col_types = FALSE) })
如果使用vroom同理修改即可:
vroom::vroom(input$upload$datapath, progress = FALSE, show_col_types = FALSE)
- 方法2:全局关闭读取包的进度输出
如果你的Shiny应用中多处用到这类读取函数,可以在应用代码最开头添加全局配置,一次性关闭所有相关输出:
# 关闭readr的进度和列类型提示 options(readr.show_progress = FALSE, readr.show_col_types = FALSE) # 关闭vroom的进度提示 options(vroom.show_progress = FALSE, vroom.show_col_types = FALSE)
- 方法3:临时屏蔽执行输出
如果不想修改读取函数的参数,可以用capture.output()临时捕获读取过程的输出不向外传递:
data <- reactive({ req(input$upload) capture.output( df <- read_csv2(input$upload$datapath), file = NULL ) return(df) })
内容的提问来源于stack exchange,提问作者Domi
相关产品推荐
相关产品推荐

