提问人:panman 提问时间:10/31/2023 更新时间:10/31/2023 访问量:83
当函数的工作完成时,停止执行包中的函数
Stop the execution of a function from a package when its job is done
问:
我知道如何使用 or 停止使用循环的函数。就我而言,我想使用软件包中的函数从网络上的ZIP存档中下载单个文件。存档有多个包含文件的目录,但可以通过将子目录名称添加到文件名中来专门指向所需的文件。因此,例如,要下载文件并在远程ZIP存档中的文件夹中,可以编写:stop()
break
archive_extract()
archive
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)所需的时间。由于某种原因,它继续工作,就好像它在仅下载了这两个文件后下载了ZIP文件中的所有文件一样。archive_extract()
我想在下载所需文件后停止执行。由于没有循环,因此检查下载文件夹中的文件数 with and using 和 end 执行不起作用。将调用包装在带有调用 to 的条件中也不起作用。list.files()
while()
break
archive_extract()
stop()
有谁知道如何在这种情况下在仅删除所需的文件后中断功能?
答:
简短的回答是,今天没有很好的方法可以直接从脚本中执行此操作。
在archive_extract C++代码的主循环中,您可以看到它读取文件中的每个存档条目,将其与所需文件列表进行匹配并提取匹配的文件。一旦它读取了所有文件,它就会继续做同样的事情,在它现在空的文件名列表中寻找匹配项。
现在,如果有人向该存储库提交拉取请求,并在该值达到文件名计数后退出循环,您将得到您想要的东西。num_extracted
评论
archive_extract
require(devtools); install_github("allenluce/archive")
评论