如何用R的sink()捕获googledrive包的文件复制响应到文本文件?
解决googledrive输出无法被sink()捕获的问题
问题原因
googledrive包的控制台提示内容是通过cli库生成的特殊格式输出,这类输出不会被标准的sink()函数捕获——sink()仅能捕获R的标准输出(stdout)和标准错误流(stderr),而cli输出是直接发送到终端的独立内容。
解决方案
以下两种方法可以有效捕获并保存这些复制确认信息:
方法1:使用cli包的capture_cli()函数
该函数专门用于捕获cli生成的所有输出,步骤如下:
# 先安装cli包(首次使用时) # install.packages("cli") library(cli) library(googledrive) # 捕获复制操作的cli输出 log_content <- capture_cli({ drive_cp(file = as_id(googledrive_file_id), path = as_id(googledrive_id), name = zipfile) }) # 将捕获的内容写入日志文件 writeLines(log_content, "test_log.txt")
方法2:捕获dribble对象的打印输出
drive_cp()会返回一个dribble类型的对象,控制台的提示内容本质是该对象被打印时生成的。我们可以手动打印这个对象并捕获输出:
library(googledrive) # 执行复制操作并保存结果对象 copy_result <- drive_cp(file = as_id(googledrive_file_id), path = as_id(googledrive_id), name = zipfile) # 捕获打印结果时的输出 log_content <- capture.output(print(copy_result)) # 写入日志文件 writeLines(log_content, "test_log.txt")
注意事项
你的原代码中drive_cp()调用末尾多了一个多余的右括号,需要删除才能正常运行。
内容的提问来源于stack exchange,提问作者Heather
相关产品推荐
相关产品推荐

