【问题标题】:R: Using wait=FALSE in system() with multiline commandsR:在 system() 中使用 wait=FALSE 和多行命令
【发布时间】:2014-06-17 16:53:32
【问题描述】:

我有一个长时间运行的进程(用 Java 编写),我希望与系统异步运行(...,wait=FALSE)。为了能够确定进程何时结束,我想在之后根据How to determine when a process started with system(..., wait=FALSE) has ended 中给出的建议创建一个文件。问题是等待参数似乎只适用于多行系统命令中的最后一行,我似乎找不到解决方法。

例子:

system('sleep 2')                 # waits 2 seconds before control is returned to the user
system('sleep 2', wait=FALSE)     # control is returned immediately
system('sleep 2; ls', wait=FALSE) # waits 2 seconds before control is returned to the user

顺便说一句,我在 mac 系统上运行...

【问题讨论】:

    标签: r


    【解决方案1】:

    我觉得奇怪的是 R 的系统只等待第一个命令(它应该调用 shell,然后等待两个命令)但是使用 && 应该这样做:

    system('sleep 2 && ls', wait=FALSE)
    

    如果 R 将 & 附加到命令行,它将变为 sleep 2; ls &,并且 & 只影响第二个参数。

    另一种解决方案是在命令周围加上括号,( sleep 2 ; ls ) & 依次执行这两个操作:

    system('( sleep 2 ; ls )', wait=FALSE)
    

    【讨论】:

    • 我也对此感到困惑,特别是因为文档指出它正在将“&”附加到调用以支持等待。使用多行命令在终端中执行此操作可以正常工作..?无论如何,你的方法是有效的。
    • 这解释了它的奇怪行为,我已经扩展了答案。
    • 很容易确认 R 只是将 & 附加到命令中,查看系统代码...if (!wait && !intern) command <- paste(command, "&")
    • 值得注意的是,这会导致 Linux 和 Windows 之间的行为不一致;这似乎是系统的一个连续故事(不足为奇)。
    • @rpierce 我同意,这很可悲。这归结为他们使用不同的外壳。尽管在这种情况下,我应该注意您在 Windows 上没有 sleepls。 :)
    猜你喜欢
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2019-09-27
    相关资源
    最近更新 更多