当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R system 调用系统命令


R语言 system 位于 base 包(package)。

说明

system 调用command 指定的操作系统命令。

用法

system(command, intern = FALSE,
       ignore.stdout = FALSE, ignore.stderr = FALSE,
       wait = TRUE, input = NULL, show.output.on.console = TRUE,
       minimized = FALSE, invisible = TRUE, timeout = 0,
       receive.console.signals = wait)

参数

command

要调用的系统命令,作为字符串。

intern

一个逻辑的(不是NA) 指示是否将命令的输出捕获为R字符向量。

ignore.stdout , ignore.stderr

一个逻辑的(不是NA) 指示消息是否写入‘标准输出' 或者 '标准错误’应该被忽略。

wait

一个逻辑的(不是NA)表明是否R解释器应该等待命令完成,或者异步运行它。如果出现以下情况,这将被忽略(并且解释器将始终等待):intern = TRUE。异步运行该命令时,屏幕上不会显示任何输出RguiWindows 中的控制台(它将被删除)。

input

如果提供了字符向量,则每行将一个字符串复制到临时文件,并且 command 的标准输入将重定向到该文件。

timeout

超时(以秒为单位),如果为 0,则忽略。这是在单独进程中运行 command 所用时间的限制。秒的小数部分将被忽略。

receive.console.signals

一个逻辑的(不是NA)指示命令是否应该从终端/控制台接收事件R运行自,特别是是否应该被中断Ctrl-C。这将被忽略,并且事件将始终被接收intern = TRUE或者wait = TRUE.

show.output.on.console , minimized , invisible

在 Windows 上接受但在此平台上忽略的参数,并带有警告。

细节

多年来,这个接口变得相当复杂:请参阅system2以获得更便携、更灵活的接口,推荐用于新代码。

command被解析为命令加上由空格分隔的参数。因此,如果命令的路径(或单个参数,例如文件路径)包含空格,则必须用引号引起来,例如经过shQuote。类 Unix 系统将命令行传递给 shell(通常是‘/bin/sh’,并且 POSIX 需要该 shell),所以command可以是 shell 认为可执行的任何内容,包括 shell 脚本,并且它可以包含多个命令,用;.

在 Windows 上,system 不使用 shell,并且有一个单独的函数 shell 将命令行传递给 shell。

如果internTRUE然后popen用于调用命令并将输出逐行收集到R character向量。如果internFALSE然后是C函数system用于调用命令。

wait 是通过将 & 附加到命令来实现的:这原则上是 shell-dependent,但 POSIX 要求并因此得到广泛支持。

timeout 不为零时,命令将在给定秒数后终止。终止适用于典型命令,但不能保证:可以编写一个在超时后继续运行的程序。超时只能使用 wait = TRUE 设置。

超时不能与交互式命令一起使用:该命令使用从“重定向”的标准输入运行/dev/空’并且不得修改终端设置。只要有ttytostop选项被禁用,通常默认情况下是禁用的,执行的命令可能会写入标准输出和标准错误。不能指望子进程的执行时间会包含在其中user.childsys.child的元素proc_time由返回proc.time。对于要包含的时间,所有子进程都必须等待其父进程,这必须在父应用程序中实现。

前两个参数之后的参数顺序有时会发生变化:建议将所有参数命名在第一个参数之后。

使用 system 来确定命令是否可以运行有很多陷阱 — Sys.which 更合适。

receive.console.signals = TRUE 在运行异步进程(使用 wait = FALSE )来实现同步操作时很有用。在所有其他情况下,建议使用默认值。

如果intern = TRUE,给出命令输出的字符向量,每个字符串一行。 (在某些系统上,超过 8095 字节的输出行将被分割。)如果该命令无法运行,R产生错误。如果command运行但给出非零退出状态,这将在属性中报告并带有警告"status"结果的:一个属性"errmsg"也可能可用。

如果intern = FALSE,返回值是错误代码(0成功),给定不可见属性(因此需要显式打印)。如果该命令因任何原因无法运行,则该值为127并发出警告(从R3.5.0)。否则如果wait = TRUE该值是命令返回的退出状态,如果wait = FALSE这是0(常规成功值)。

如果命令超时,则会报告警告,退出状态为 124

标准输出和标准错误

对于命令行R,错误消息写入‘标准错误' 将被发送到终端,除非ignore.stderr = TRUE。它们可以被捕获(在最有可能的壳中)

    system("some command 2>&1", intern = TRUE)

对于 GUI,发送到‘的输出会发生什么?标准输出' 或者 '标准错误' 如果intern = FALSE是interface-specific,假设此类消息将出现在 GUI 控制台上是不安全的(它们出现在 macOS GUI 控制台上,但不会出现在其他一些控制台上)。

Unix 和 Windows 之间的差异

Windows 和类 Unix 操作系统之间的进程启动方式存在根本差异,其上的高级操作系统函数也存在差异。R函数已构建。因此,操作系统之间在如何处理方面存在许多差异也就不足为奇了。system行为。为了程序员的利益,本节总结了比较重要的内容。

  • 最重要的区别是,在类似 Unix 的 system 上启动一个 shell,然后运行 command 。在 Windows 上,该命令直接运行 - 使用 shell 作为通过 shell 运行 command 的接口(默认情况下 Windows shell cmd.exe ,它与 POSIX shell 有很多区别)。

    这意味着不能假设重定向或管道在 system 中起作用(重定向有时会起作用,但我们已经看到在 Windows 安全补丁后它停止工作的情况),并且 system2 (或 shell )必须是在 Windows 上使用。

  • 会发生什么stdoutstderr何时未被捕获取决于如何捕获R正在运行:Windows 批处理命令的行为与 Unix 类似,但从 Windows GUI 中它们通常会丢失。system(intern = TRUE)捕获‘标准错误' 当从 Windows GUI 控制台运行时,除非ignore.stderr = TRUE.

  • 错误时的行为有微妙的不同(并且在R版本)。

  • command 的引用约定有所不同,但 shQuote 是一个可移植接口。

  • 参数 show.output.on.consoleminimizedinvisible 仅在 Windows 上执行某些操作(并且与那里的 Rgui 最相关)。

例子

# list all files in the current directory using the -F flag
## Not run: system("ls -F")

# t1 is a character vector, each element giving a line of output from who
# (if the platform has who)
t1 <- try(system("who", intern = TRUE))

try(system("ls fizzlipuzzli", intern = TRUE, ignore.stderr = TRUE))
# zero-length result since file does not exist, and will give warning.

也可以看看

man systemman sh 了解如何在正在使用的操作系统上实现这一点。

.Platform 用于特定于平台的变量。

pipe 设置管道连接。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Invoke a System Command。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。