gpt4 book ai didi

r - 使用系统命令中断循环

转载 作者:行者123 更新时间:2023-12-03 15:03:02 25 4
gpt4 key购买 nike

我在通常使用 bash 脚本的地方越来越多地使用 Rscript。一个小小的烦恼是,这些脚本中有许多会在 system() 上循环。如果我试图中断它,那么基本上没有时间让 R 捕获我的 control-c 的调用。相反,它只是中止正在运行的系统命令并继续进行下一次循环迭代。例如,当我尝试通过按住 control-c 来中断以下操作时,它仍然可以通过所有迭代:

for(i in 1:10) {
cat(i)
system('sleep 3')
}

到目前为止,我一直只是通过在每个循环中插入一个小的暂停来解决这个问题,例如
for(i in 1:10) {
Sys.sleep(0.25)
cat(i)
system('sleep 3')
}

如果我按住 control-c,这会让我在一两次迭代中中止,但我想知道,有没有更有效的方法来完成这种行为?

最佳答案

约翰,我不确定这是否会有所帮助,但通过调查 setTimeLimit ,我了解到它可以在用户能够执行中断时停止执行,例如 Ctrl-C。见 this question对于一些引用。

特别是,回调可能是要走的路,我会查看 addTaskCallbackthis guide on developer.r-project.org .

这里还有四点建议:

  • 尽管这是一个 hack,但我可以使用一种非常不同的方法来调用两个 R session ,一个是主 session ,另一个只是为了执行主 session 传递的 shell 命令而存在,它仅在开始之前等待确认工作已完成下一个。
  • 如果您可以使用 foreach而不是 for (并行,通过 %dopar%,或串行 %do% 而不是 %dopar% 或只有 1 个注册 worker ),这可能更易于中断,因为它可能相当于第一个建议(因为它 fork R)。
  • 如果您可以检索外部命令的退出代码,则可以将其传递给有条件的循环。 This previous Q&A在这方面会有所帮助。
  • 如果您想让所有内容都在 bash 脚本中运行,那么 R 可以只编写一个长脚本(即将一个字符串或一系列字符串输出到文件中)。这可以执行并且中断保证不会影响循环,因为您已经展开循环。或者,您可以在 bash 中编写循环。 Here are examples .就个人而言,我喜欢使用 find 将命令应用于文件(例如 find .... -exec doStuff {} ';' )或通过反引号作为输入。不幸的是,我不能轻易地在 SO 上提供格式良好的代码,因为它在反引号中嵌入了反引号... See this page for examples因此,在这种情况下,您可能只有一个命令,没有循环,并将函数应用于满足一组特定条件的所有文件。通过反引号使用命令替换对于 bash 用户来说是一个非常方便的技巧。
  • 关于r - 使用系统命令中断循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8096942/

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