我知道如何使用
stop()
或 break
停止使用循环的函数。就我而言,我想使用 archive_extract()
包中的 archive
功能从网络上的 ZIP 存档下载单个文件。归档文件有多个目录,其中有文件,但可以通过在文件名中添加子目录名来具体指向所需的文件。例如,要下载远程 ZIP 存档中文件夹 bcgarem7.sav
中的文件 bcgchlz7.sav
和 TIMSS2019_IDB_SPSS_G8/Data
,可以编写:
archive_extract(archive = "https://www.iea.nl/sites/default/files/data-repository/TIMSS/TIMSS2019/TIMSS2019_IDB_SPSS_G8.zip",
dir = "/mnt/docs/,
files = c("TIMSS2019_IDB_SPSS_G8/Data/bcgarem7.sav",
"TIMSS2019_IDB_SPSS_G8/Data/bcgchlz7.sav"))
我写了一个简单的函数来让事情变得更方便:
library(archive)
download.data <- function(remote.zip, local.dir, file.names) {
archive_extract(archive = remote.zip,
dir = local.dir,
files = file.names)
}
然后调用它:
download.data(remote.zip = "https://www.iea.nl/sites/default/files/data-repository/TIMSS/TIMSS2019/TIMSS2019_IDB_SPSS_G8.zip",
local.dir = "/mnt/docs/",
file.names = c("TIMSS2019_IDB_SPSS_G8/Data/bcgarem7.sav", "TIMSS2019_IDB_SPSS_G8/Data/bcgchlz7.sav"))
这样就完成了工作,两个文件几乎是立即下载的,因为它们都低于 200K。然而,该功能又持续工作了七分钟,这是下载整个 ZIP 文件(近 1GB)所需的时间。由于某种原因,
archive_extract()
继续工作,就好像在仅下载这两个文件后下载了 ZIP 文件中的所有文件一样。
我想在下载所需的文件后停止执行。由于没有循环,使用
list.files()
检查下载文件夹中的文件数量并使用 while()
和 break
结束执行没有效果。将对 archive_extract()
的调用包装在调用 stop()
的条件中也没有效果。
有谁知道在这种情况下如何在下载所需的文件后中断功能?
简短的回答是,目前没有好的方法可以直接在脚本中执行此操作。
在 archive_extract 的 C++ 代码的主循环中,您可以看到它读取文件中的每个存档条目,将其与所需文件列表进行匹配并提取匹配的文件。一旦它读取了所有文件,它就会继续执行相同的操作,在现在为空的文件名列表中查找匹配项。 现在,如果
有人要向该存储库提交拉取请求,一旦num_extracted
值达到文件名计数,退出循环,您就会得到您想要的东西。