gpt4 book ai didi

r - R 的 download.file 的 "internal method"是什么?

转载 作者:行者123 更新时间:2023-12-04 02:20:16 24 4
gpt4 key购买 nike

我正在尝试使用 download.file 下载以下数据集, 仅适用于 method = "wget" )

# Doesn't work
download.file('http://uofi.box.com/shared/static/bba3968d7c3397c024ec.dta', tempfile(), method = "auto")
download.file('http://uofi.box.com/shared/static/bba3968d7c3397c024ec.dta', tempfile(), method = "curl")

# Works
download.file('http://uofi.box.com/shared/static/bba3968d7c3397c024ec.dta', tempfile(), method = "wget")

根据 help(download.file) ,

If method = "auto" is chosen (the default), the internal method is chosen for file:// URLs, and for the others provided capabilities("http/ftp") is true (which it almost always is).



查看源码,“内部方法”指的是:
if (method == "internal") {
status <- .External(C_download, url, destfile, quiet,
mode, cacheOK)
if (!quiet)
flush.console()
}

但还是不知道是什么 .External(C_download)确实如此,尤其是跨平台。重要的是我知道这一点而不是依赖 wget因为我正在编写一个应该跨平台工作的包。

最佳答案

源代码在 R 源中(从 http://cran.r-project.org/sources.html 下载当前版本)。相关代码(从 R 3.2.1 开始)在“./src/modules/internet/internet.c”和“./src/modules/internet/nanohttp.c”中。

根据后者,极简 HTTP GET 功能的代码基于 libxml2-2.3.6。

这些文件也可以在 R svn 站点 https://svn.r-project.org/R/branches/R-3-2-branch/src/modules/internet/internet.c 上找到。和 https://svn.r-project.org/R/branches/R-3-2-branch/src/modules/internet/nanohttp.c如果您不想下载整个 .tgz 文件并解压缩它。

如果您查看代码,您会发现其中的大部分内容跨平台是一致的。但是,在 Windows 上,似乎使用了 wininet 代码。

该代码是通过最初查看 utils 来识别的。包,因为这是 R 命令 download.file被发现。我grep在“./src/library/utils/src”目录下的c文件中下载ped,发现相关代码在“sock.c”中。那个文件里有一条评论,上面写着 /* from src/main/internet.c */所以我接下来去了“internet.c”。

关于您的特定文件,问题在于您拥有的链接返回 302 Found状态码。在 Windows 上使用 wget,下载例程遵循 Location 302 响应的字段并获取实际文件。使用 curl 方法有效,但前提是您提供参数 extra="-L" .

download.file('http://uofi.box.com/shared/static/bba3968d7c3397c024ec.dta', tempfile(), method = "curl", extra="-L")

有一个名为 downloader 的包它声称为 https 提供了一个很好的跨平台解决方案。给定一个 http URL,它只是将调用传递给 download.file .这是一个也适用于 http 的版本。它也默认为二进制传输,这似乎通常是一个好主意。
my_download <- function(url, destfile, method, quiet = FALSE,
mode = "wb", cacheOK = TRUE, extra = getOption("download.file.extra")) {
if (.Platform$OS.type == "windows" && (missing(method) || method %in% c("auto", "internal", "wininet"))) {
seti2 <- utils::"setInternet2"
internet2_start <- seti2(NA)
on.exit(suppressWarnings(seti2(internet2_start)))
suppressWarnings(seti2(TRUE))
} else {
if (missing(method)) {
if (nzchar(Sys.which("wget")[1])) {
method <- "wget"
} else if (nzchar(Sys.which("curl")[1])) {
method <- "curl"
if (!grepl("-L", extra)) {
extra <- paste("-L", extra)
}
} else if (nzchar(Sys.which("lynx")[1])) {
method <- "lynx"
} else {
stop("no download method found")
}
}
}
download.file(url = url, destfile = destfile, method = method, quiet = quiet, mode = mode,
cacheOK = cacheOK, extra = extra)
}

关于r - R 的 download.file 的 "internal method"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30906387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com