我想通过ftp下载文件,还可以捕获ftp日志。我设法做到这一点:
options(internet.info = 0) # displays the ftp log in the console
x <- capture.output(
download.file("ftp://speedtest.tele2.net/1KB.zip", destfile = tempfile()),
type = "message"
)
这将在控制台中显示ftp日志,并将一些download.file()
输出捕获到变量x
,但它不会捕获ftp日志。我也尝试了sink()
的一些摆弄,但没有成功。
任何人都可以向我解释为什么这不起作用,有没有办法实现我想要的?我想处理一些ftp消息,所以简单地找回错误代码是不够的。
答案 0 :(得分:1)
如果您使用的是Linux或Cygwin或Git bash,则可以将脚本的结果通过管道传输到文本文件中。如果将代码(没有输出捕获)放入名为script.R
的文件中,则可以将所有输出传递给文本文件:
Rscript script.R &> script.txt
你可以在R中做这样的事情 - 但这让我觉得很邪恶:
uri <- "ftp://speedtest.tele2.net/1KB.zip"
destination <- tempfile()
system2("Rscript",
c("-e",
sprintf("\"options(internet.info = 0);download.file('%s', destfile = '%s', quiet = FALSE)\"",
uri,
destination)),
stderr = TRUE, stdout = TRUE)
答案 1 :(得分:1)
在sebastian-c和原始软件包作者的帮助下,我能够使用curl包为我的问题设计解决方案。我会在这里为后人保留它:
curl_download_with_log <- function(
url,
destfile
){
log <- rawConnection(raw(), 'r+')
on.exit(close(log))
stopifnot(is.character(url))
h <- curl::new_handle(
debugfunction = function(type, data){
if(type %in% c(0, 1, 2)){
writeBin(data, log)
}
},
verbose = TRUE
)
try({
curl::curl_download(url, destfile = destfile, handle = h)
})
rawToChar(rawConnectionValue(log))
}
此函数将文件保存到destfile
,并将日志作为字符向量返回。
解释:
debugfunction
告诉libcurl如何处理调试数据。在这种情况下,将其写入二进制连接
if(type %in% c(0, 1, 2)){...}
确保只将日志数据写入调试连接。如果不这样做,您下载的整个文件将与协议数据一起写入调试日志(有关不同调试级别的说明,请参阅link)