完成工作后停止执行包中的函数

问题描述 投票:0回答:1

我知道如何使用

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()
的条件中也没有效果。

有谁知道在这种情况下如何在下载所需的文件后中断功能?

r interrupt
1个回答
0
投票

简短的回答是,目前没有好的方法可以直接在脚本中执行此操作。

在 archive_extract 的 C++ 代码的主循环中,您可以看到它读取文件中的每个存档条目,将其与所需文件列表进行匹配并提取匹配的文件。一旦它读取了所有文件,它就会继续执行相同的操作,在现在为空的文件名列表中查找匹配项。 现在,如果

有人要向该存储库提交拉取请求

,一旦num_extracted值达到文件名计数,退出循环,您就会得到您想要的东西。

    

© www.soinside.com 2019 - 2024. All rights reserved.