system {base} | R Documentation |
system
invokes the OS command specified by command
.
system(command, intern = FALSE, ignore.stdout = FALSE, ignore.stderr = FALSE, wait = TRUE, input = NULL, show.output.on.console = TRUE, minimized = FALSE, invisible = TRUE)
command |
the system command to be invoked, as a character string. |
intern |
a logical (not |
ignore.stdout, ignore.stderr |
a logical (not |
wait |
a logical (not |
input |
if a character vector is supplied, this is copied one
string per line to a temporary file, and the standard input of
|
show.output.on.console |
logical (not |
minimized |
logical (not |
invisible |
logical (not |
command
is parsed as a command plus arguments separated by spaces.
So if the path to the command (or an argument) contains
spaces, it must be quoted e.g. by shQuote
.
Only double quotes are allowed on Windows: see the examples. (Note: a
Windows path name cannot contain a double quote, so we do not need to
worry about escaping embedded quotes.)
command
must be an executable (extensions ‘.exe’,
‘.com’) or a batch file (extensions ‘.cmd’ and ‘.bat’):
these extensions are tried in turn if none is supplied.) This means
that redirection, pipes, DOS internal commands, ... cannot be used:
see shell
.
The search path for command
may be system-dependent: it will
include the R ‘bin’ directory, the working directory and the
Windows system directories before PATH.
The ordering of arguments after the first two has changed from time to time: it is recommended to name all arguments after the first.
There are many pitfalls in using system
to ascertain if a
command can be run — Sys.which
is more suitable.
If intern = TRUE
, a character vector giving the output of the
command, one line per character string. (Output lines of more than
8095 bytes will be split.) If the command could not be run an R
error is generated.
Under the Rgui
console intern = TRUE
also captures
stderr
unless ignore.stderr = TRUE
.
If command
runs but gives a non-zero exit status this will be
reported with a warning and in the attribute "status"
of the
result: an attribute "errmsg"
may also be available
If intern = FALSE
, the return value is an error code (0
for success), given the invisible attribute (so needs to be printed
explicitly). If the command could not be run for any reason, the
value is 127
. Otherwise if wait = TRUE
the value is the
exit status returned by the command, and if wait = FALSE
it is
0
(the conventional success value).
Some Windows commands return out-of-range status values
(e.g. -1
) and so only the bottom 16 bits of the value are used.
If intern = FALSE, wait = TRUE, show.output.on.console = TRUE
the
‘stdout’ and ‘stderr’ (unless ignore.stdout = TRUE
or
ignore.stderr = TRUE
) output from a command that is a
‘console application’ should appear in the R console
(Rgui
) or the window running R (Rterm
).
Not all Windows executables properly respect redirection of output, or
may only do so from a console application such as Rterm
and not
from Rgui
: for example, ‘fc.exe’ was among these in the past,
but we have had more success recently.
Precisely what is seen by the user depends on the optional parameters,
whether Rgui
or Rterm
is being used, and whether a
console command or GUI application is run by the command.
By default nothing will be seen in either front-end until the command finishes and the output is displayed.
For console commands Rgui
will open a new ‘console’, so
if invisible = FALSE
, a commands window will appear for the
duration of the command. For Rterm
a separate commands window
will appear for console applications only if wait = FALSE
and
invisible = FALSE
.
GUI applications will not display in either front-end unless
invisible
is false.
It is possible to interrupt a running command being waited for from
the keyboard (using the Esc key in Rgui
or Ctrl-C
in Rterm
) or from the Rgui
menu: this should at least
return control to the R console. R will attempt to shut down the
process cleanly, but may need to force it to terminate, with the
possibility of losing unsaved work, etc.
Do not try to run console applications that require user
input from Rgui
setting intern = TRUE
or
show.output.on.console = TRUE
. They will not work.
How processes are launched differs fundamentally between Windows and
Unix-alike operating systems, as do the higher-level OS functions on
which this R function is built. So it should not be surprising that
there are many differences between OSes in how system
behaves.
For the benefit of programmers, the more important ones are summarized
in this section.
The most important difference is that on a Unix-alike
system
launches a shell which then runs command
. On
Windows the command is run directly – use shell
for an
interface which runs command
via a shell (by default
the Windows shell cmd.exe
, which has many differences from
the POSIX shell).
This means that it cannot be assumed that redirection or piping will
work in system
(redirection sometimes does, but we have seen
cases where it stopped working after a Windows security patch), and
system2
(or shell
) must be used on Windows.
What happens to stdout
and stderr
when not
captured depends on how R is running: Windows batch commands behave
like a Unix-alike, but from the Windows GUI they are
generally lost. system(intern=TRUE)
captures ‘stderr’
when run from the Windows GUI console unless ignore.stderr =
TRUE
.
The behaviour on error is different in subtle ways (and has differed between R versions).
The quoting conventions for command
differ, but
shQuote
is a portable interface.
Arguments show.output.on.console
, minimized
,
invisible
only do something on Windows (and are most relevant
to Rgui
there).
shell
or shell.exec
for a less raw
interface.
.Platform
for platform-specific variables.
pipe
to set up a pipe connection.
# launch an editor, wait for it to quit ## Not run: system("notepad myfile.txt") # launch your favourite shell: ## Not run: system(Sys.getenv("COMSPEC")) ## Not run: ## note the two sets of quotes here: system(paste('"c:/Program Files/Mozilla Firefox/firefox.exe"', '-url cran.r-project.org'), wait = FALSE) ## End(Not run)